Suivez à travers les machines (pid) ssh
Question
Je suis en train d'écrire essentiellement une commande semblable à pstree sauf qu'il doit suivre les processus dans les machines.
Ce que je veux dire est que si je lance ceci:
$ ssh $node sleep 1000
Ensuite, la commande doit afficher quelque chose comme ceci:
ssh $node -- ($node) sleep 1000
Et si je suis en cours d'exécution:
$ ssh $node ssh $node sleep 1000
ssh $node---($node) ssh $node---($node) sleep 1000
Et ainsi de suite ...
Ma question est la suivante: Comment puis-je la carte une session ssh sur une machine à un processus donné naissance sur une autre machine
?processus parent-enfant local ne sont pas un problème, mais comment puis-je savoir quelle commande ssh sur un nœud qui a déclenché un autre processus sur un autre nœud.
-
linux 2.6.18
-
ne OpenSSH pour des choses "à distance". Exécution OpenSSH_4.3p2 actuellement.
-
accès SSH à tous les nœuds de cours (auth à base de clé) de manière ps et netstat sont disponibles à partir de tous les nœuds.
-
Linux uniquement "hacks" sont très bien, n'a pas besoin d'être portable si ce serait un bonus supplémentaire bien sûr.
-
L'utilisateur sera toujours le même et ma commande / script est en cours d'exécution de cet utilisateur. Cet utilisateur n'est pas racine.
-
N'a pas d'être rapide, que précis.
La solution spontanée serait d'écrire un clone pstree
, qui déclenche sur la chaîne de commande « ssh
», les chiffres sur la source de port, puis va à la machine distante en question et les chiffres sur lesquels l'un des enfants de sshd
qui a été pondu par cette commande particulière.
Mais peut-être il y a un moyen plus intelligent? : P
La solution
En fait, je pense que votre solution spontanée est la bonne façon de le faire: utiliser netstat pour obtenir la source de port et chercher sur la machine distante. Vous pourriez avoir du mal à utiliser « -p netstat » sans être root -. Je l'ai essayé sur deux machines, un qui était heureux de me montrer mes propres processus et qui n'a pas été
En plus des clients ssh, vous pouvez l'étendre à chercher d'autres clients qui utilisent des connexions SSH, comme rsync ou Mercurial. Il suffit de faire attention à ne pas tracer propre connexion de votre programme récursive!
Une expérience rapide avec netstat et pstree montre que l'idée est bonne:
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
Je serais curieux de voir le résultat, car il serait très utile pour moi!