Siga IDPs a través de máquinas (SSH)
Pregunta
Básicamente, estoy tratando de escribir un comando pstree similar, excepto que debe seguir procesos a través de máquinas.
Lo que quiero decir es que si me quedo esto:
$ ssh $node sleep 1000
A continuación, el comando debería mostrar algo como esto:
ssh $node -- ($node) sleep 1000
Y si estoy ejecutando:
$ ssh $node ssh $node sleep 1000
ssh $node---($node) ssh $node---($node) sleep 1000
Y así sucesivamente ...
Mi pregunta es la siguiente: ¿Cómo puedo asignar una sesión ssh en una máquina a un proceso generado en otra máquina
?Los procesos locales de padres e hijos no son un problema, pero ¿cómo puedo averiguar qué comando ssh en un nodo que desencadenó otro proceso en otro nodo.
-
Linux 2.6.18
-
Sólo openSSH para la materia "a distancia". Correr OpenSSH_4.3p2 actualmente.
-
acceso SSH a todos los nodos de curso (auth basado llave) de manera ps y netstat están disponibles en todos los nodos.
-
Linux de sólo "hacks" están bien, no tiene por qué ser portátil aunque eso sería una ventaja añadida, por supuesto.
-
El usuario siempre será el mismo y mi comando / script se está ejecutando como ese usuario. Que el usuario no es root.
-
No tiene que ser rápido, sólo se precisa.
La solución espontánea sería escribir un clon pstree
, que desencadena en la cadena de comando "ssh
", se da cuenta de la fuente de puertos y luego se va a la máquina remota en cuestión y se da cuenta de lo que uno de los hijos de sshd
que tuvo su origen por este comando en particular.
Pero tal vez hay una manera más inteligente? : P
Solución
En realidad, creo que su solución espontánea es la forma correcta de hacerlo: el uso netstat para obtener el código fuente puertos y buscar la información en la máquina remota. Es posible que tenga problemas para usar "-p netstat" sin ser root -. Lo probé en dos máquinas, una que estaba feliz de mostrarme mis propios procesos y uno que no era
Además de clientes ssh, es posible extender este para buscar otros clientes que utilizan las conexiones ssh, como rsync o mercurial. Sólo tenga cuidado de no rastrear propia conexión de su programa de forma recursiva!
Un experimento rápido con netstat y pstree muestra que la idea es buena:
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
Yo estaría interesado en ver el resultado, ya que sería muy útil para mí!