2010-02-08 15 views
5

我基本上試圖編寫一個類似pstree的命令,除了它應該遵循跨機器的過程。遵循機器間的pid(ssh)

我的意思是,如果我運行此:

$ ssh $node sleep 1000 

然後命令應顯示是這樣的:

ssh $node -- ($node) sleep 1000 

如果我運行:

$ ssh $node ssh $node sleep 1000 

ssh $node---($node) ssh $node---($node) sleep 1000 

依此類推...

我的問題是:如何將一臺機器上的一個ssh會話映射到另一臺機器上的衍生進程?

本地父子進程不是問題,但我怎樣才能找出哪個ssh命令在一個節點上觸發另一個節點上的另一個進程。

  1. 的Linux 2.6.18

  2. 只採用openSSH爲 「遠程」 的東西。目前運行OpenSSH_4.3p2。

  3. SSH訪問當然是所有節點(基於密鑰的身份驗證),所以ps和netstat從所有節點都可用。

  4. 只有Linux的「黑客」沒有問題,不需要隨身攜帶,雖然這是額外的好處。

  5. 用戶將永遠是相同的,我的命令/腳本以該用戶身份運行。該用戶不是root用戶。

  6. 不一定要快,只有準確。

自發的解決辦法是寫pstree克隆,即在命令字符串「ssh」觸發器,計算出所述源端口,然後進入到遠程機器的問題,並計算出的sshd哪一個這個特殊命令催生的孩子們。

但也許有更聰明的方法? :P

+0

我不完全理解這個問題。 「映射」ssh會話意味着什麼?你想給你的ssh會話命名嗎? (那麼漂亮的應用程序的屏幕將是我的指針溶液) – Karussell 2010-02-08 22:15:47

+0

我要地圖命令的進程ID: 「SSH $節點休眠1000」 向命令的進程ID: 睡眠1000「 在遠程機器上($節點)。 – user268744 2010-02-09 07:15:09

回答

1

其實,我認爲你的自發解決方案是正確的做法:使用netstat獲取源端口並在遠程機器上查找它。使用「netstat -p」時可能會遇到問題,而無法成爲根用戶 - 我在兩臺機器上嘗試過它,一臺很高興向我展示自己的進程,另一臺不是。

與ssh客戶端一樣,您可以擴展它以查找其他使用ssh連接的客戶端,如rsync或Mercurial。只是要小心,不要遞歸地跟蹤程序自己的連接!

快速實驗用netstat和pstree表明觀點是正確的:

[email protected]:~$ netstat -p 
(Not all processes could be identified, non-owned process info 
will not be shown, you would have to be root to see it all.) 
Active Internet connections (w/o servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 mymachine.example:43681 remote.example.com:ssh ESTABLISHED 27044/ssh 
tcp  0  0 mymachine.example:39228 remote.example.com:ssh ESTABLISHED 14499/ssh 
tcp  0  0 mymachine.example:45814 remote.example.com:ssh ESTABLISHED 20899/ssh 
[email protected]:~$ ssh remote netstat -p | grep mymachine.example:43681 
tcp  0  0 remote.example.com:ssh mymachine.example:43681 ESTABLISHED 10361/1 
[email protected]:~$ ssh remote pstree -a 10361 
sshd 
    `-grep -n -e wotsit -i -R /local/home/me/somewhere /dev/null 

我很想看到的結果,因爲這將是對我非常有用的!