質問
私は基本的に pstree のようなコマンドを書こうとしていますが、マシン間のプロセスを追跡する必要がある点が異なります。
私が言いたいのは、これを実行すると:
$ ssh $node sleep 1000
次に、コマンドは次のように表示されるはずです。
ssh $node -- ($node) sleep 1000
そして、私が実行している場合:
$ ssh $node ssh $node sleep 1000
ssh $node---($node) ssh $node---($node) sleep 1000
等々 ...
私の質問はこれです:あるマシン上の 1 つの SSH セッションを別のマシン上で生成されたプロセスにマッピングするにはどうすればよいですか?
ローカルの親子プロセスは問題ありませんが、あるノード上のどの ssh コマンドが別のノード上の別のプロセスをトリガーしたかを特定するにはどうすればよいですか。
Linux 2.6.18
「リモート」のものに対してのみ openSSH を使用します。現在 OpenSSH_4.3p2 を実行しています。
もちろんすべてのノードへの SSH アクセス (キーベースの認証) なので、すべてのノードから ps と netstat を利用できます。
Linux 専用の「ハック」は問題ありません。移植可能である必要はありませんが、もちろんそれは追加のボーナスになります。
ユーザーは常に同じであり、コマンド/スクリプトはそのユーザーとして実行されます。そのユーザーは root ではありません。
速い必要はなく、正確である必要があります。
自発的な解決策は、次のように書くことです。 pstree
コマンド文字列でトリガーされるクローン "ssh
"、送信元ポートを特定し、問題のリモート マシンにアクセスして、次のどれであるかを特定します。 sshd
この特定のコマンドによって生成された の子。
しかし、もっと賢い方法があるかもしれません?:P
解決
実は、私はあなたの自発的なソリューションがそれを行うには正しい方法だと思います。ソースポートを取得し、リモートマシン上でそれを探すためには、netstatを使用しています。あなたは、ルートされることなく「netstatコマンドの-p」を使用してトラブルがあるかもしれない - 私は2台のマシン、私にはなかった私自身のプロセスと1を示して幸せだったもので、それを試してみました。
。と同様にSSHクライアントは、rsyncのかMercurialのように、ssh接続を使用する他のクライアントを探すために、これを拡張することがあります。ただ、再帰的にあなたのプログラムの独自の接続をトレースしないように注意してください!
netstatコマンドとpstreeコマンドで迅速な実験では、アイデアが健全であることを示しています:
me@mymachine:~$ 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
me@mymachine:~$ ssh remote netstat -p | grep mymachine.example:43681
tcp 0 0 remote.example.com:ssh mymachine.example:43681 ESTABLISHED 10361/1
me@mymachine:~$ ssh remote pstree -a 10361
sshd
`-grep -n -e wotsit -i -R /local/home/me/somewhere /dev/null
それは私にとって非常に有用であろうので、私は、結果を見て興味があると思います!