Pergunta

Estou basicamente tentando escrever um comando do tipo pstree, exceto que ele deve seguir os processos nas máquinas.

O que quero dizer é que, se eu executar isso:

$ ssh $node sleep 1000

Então o comando deve exibir algo assim:

ssh $node -- ($node) sleep 1000

E se estou correndo:

$ ssh $node ssh $node sleep 1000

ssh $node---($node) ssh $node---($node) sleep 1000

E assim por diante ...

Minha pergunta é a seguinte: como posso mapear uma sessão SSH em uma máquina para um processo gerado em outra máquina?

Os processos locais de pai-filho não são um problema, mas como posso descobrir qual comando ssh em um nó que acionou outro processo em outro nó.

  1. Linux 2.6.18

  2. Apenas abre para coisas "remotas". Running OpenSSH_4.3p2 Atualmente.

  3. Acesso SSH a todos os nós, é claro (autenticação baseada em chave), para que o PS e o NetStat estejam disponíveis em todos os nós.

  4. Os "hacks" somente Linux são bons, não precisam ser portáteis, embora isso seja um bônus adicional, é claro.

  5. O usuário sempre será o mesmo e meu comando/script está em execução como esse usuário. Esse usuário não é root.

  6. Não precisa ser rápido, apenas preciso.

A solução espontânea seria escrever um pstree Clone, que gire a sequência de comando "ssh", descobre a fonte da fonte e depois vai para a máquina remota em questão e descobre qual de sshdAs crianças que foram geradas por esse comando em particular.

Mas talvez haja uma maneira mais inteligente? : P

Foi útil?

Solução

Na verdade, acho que sua solução espontânea é a maneira certa de fazê-lo: use o NetStat para obter a porta-fonte e procurá-la na máquina remota. Você pode ter problemas para usar o "netstat -p" sem ser raiz - eu tentei em duas máquinas, uma que ficou feliz em me mostrar meus próprios processos e um que não foi.

Além dos clientes SSH, você pode estendê -lo para procurar outros clientes que usam conexões SSH, como RSYNC ou Mercurial. Apenas tome cuidado para não rastrear recursivamente a própria conexão do seu programa!

Um experimento rápido com o NetStat e PSTree mostra que a ideia é sólida:

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

Eu estaria interessado em ver o resultado, porque seria muito útil para mim!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top