我基本上是在尝试编写一个类似 pstree 的命令,只不过它应该遵循跨机器的进程。

我的意思是,如果我运行这个:

$ 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

有帮助吗?

解决方案

事实上,我认为你自发的解决方案是正确的方法:使用 netstat 获取源端口并在远程计算机上查找它。如果不是 root,您可能会遇到使用“netstat -p”的问题 - 我在两台机器上尝试过,其中一台很乐意向我展示我自己的进程,而另一台则不然。

除了 ssh 客户端之外,您还可以扩展它来查找使用 ssh 连接的其他客户端,例如 rsync 或 Mercurial。只是要小心,不要递归地跟踪程序自己的连接!

使用 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

我很想看看结果,因为它对我非常有用!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top