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.

  1. Linux 2.6.18

  2. Sólo openSSH para la materia "a distancia". Correr OpenSSH_4.3p2 actualmente.

  3. acceso SSH a todos los nodos de curso (auth basado llave) de manera ps y netstat están disponibles en todos los nodos.

  4. 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.

  5. El usuario siempre será el mismo y mi comando / script se está ejecutando como ese usuario. Que el usuario no es root.

  6. 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

¿Fue útil?

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í!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top