我基本上是在尝试编写类似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命令。
linux 2.6.18
只有openSSH用于“远程”的东西。目前正在运行OpenSSH_4.3p2。
当然,SSH访问所有节点(基于密钥的身份验证),因此所有节点都可以使用ps和netstat。
只有Linux“hacks”很好,不需要便携,但当然这会是一个额外的好处。
用户将始终保持不变,并且我的命令/脚本正在以该用户身份运行。该用户不是root用户。
不一定要快,只有准确。
自发解决方案是编写一个pstree
克隆,在命令字符串“ssh
”上触发,找出源端口,然后转到相关的远程机器并计算出来这个特定命令产生了sshd
个孩子中的哪一个。
但也许有更聪明的方法? :P
答案 0 :(得分:1)
实际上,我认为你的自发解决方案是正确的方法:使用netstat获取源端口并在远程计算机上查找它。您可能无法使用“netstat -p”而不是root用户 - 我在两台计算机上尝试过,一台很高兴向我展示我自己的流程,另一台却没有。
与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
我有兴趣看到结果,因为它对我非常有用!