Seguire pid attraverso macchine (SSH)
Domanda
sto fondamentalmente cercando di scrivere un comando pstree simile, tranne che dovrebbe seguire i processi attraverso le macchine.
Quello che voglio dire è che se corro questo:
$ ssh $node sleep 1000
Poi il comando deve visualizzare qualcosa di simile:
ssh $node -- ($node) sleep 1000
E se sto correndo:
$ ssh $node ssh $node sleep 1000
ssh $node---($node) ssh $node---($node) sleep 1000
E così via ...
La mia domanda è questa: come posso mappare una sessione ssh su una macchina a un processo generato su un'altra macchina
?processi locali padre-figlio non sono un problema, ma come posso capire quali comando ssh su un nodo che ha attivato un altro processo in un altro nodo.
-
Linux 2.6.18
-
solo OpenSSH per roba "a distanza". Esecuzione OpenSSH_4.3p2 attualmente.
-
l'accesso SSH per tutti i nodi del corso (chiave di autenticazione basato) in modo ps e netstat sono disponibili presso tutti i nodi.
-
Linux-only "hack" vanno bene, non ha bisogno di essere portatile, tuttavia, che sarebbe un ulteriore bonus, naturalmente.
-
L'utente sarà sempre lo stesso e il mio comando / script è in esecuzione come quell'utente. Questo utente non è root.
-
non deve essere veloce, solo accurata.
La soluzione spontanea sarebbe quella di scrivere un clone pstree
, che si innesca quando la stringa di comando "ssh
", figure la fonte porta e poi va alla macchina remota in questione e le figure che uno dei figli di sshd
che è stato generato da questo particolare comando.
Ma forse c'è un modo più intelligente? : P
Soluzione
In realtà, credo che la soluzione spontanea è il modo giusto per farlo: l'uso netstat per ottenere la fonte-porto e cercarlo sulla macchina remota. Si potrebbe avere problemi con l'uso "-p netstat" senza essere root -. Ho provato su due macchine, uno che era felice di mostrarmi i miei processi e uno che non era
Così come client ssh, si potrebbe estendere questo per cercare altri client che utilizzano connessioni ssh, come rsync o Mercurial. Basta essere attenti a non tracciare propria connessione del vostro programma in modo ricorsivo!
Un esperimento veloce con netstat e pstree mostra che l'idea è suono:
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
Sarei curioso di vedere il risultato, perché sarebbe molto utile per me!