Следуйте pids через машины (ssh) - PullRequest
5 голосов
/ 08 февраля 2010

Я в основном пытаюсь написать pstree-подобную команду за исключением того, что она должна следовать процессам на разных машинах.

Я имею в виду, что если я запущу это:

$ ssh $node sleep 1000

Тогда команда должна отобразить что-то вроде этого:

ssh $node -- ($node) sleep 1000

А если я бегу:

$ ssh $node ssh $node sleep 1000

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

И так далее ...

У меня такой вопрос: как я могу сопоставить один сеанс SSH на одном компьютере с порожденным процессом на другом компьютере?

Локальные родительско-дочерние процессы не являются проблемой, но как мне определить, какая команда ssh на одном узле запустила другой процесс на другом узле.

  1. Linux 2.6.18

  2. только openSSH для "удаленных" вещей. Работает OpenSSH_4.3p2 в настоящее время.

  3. SSH-доступ ко всем узлам, конечно (аутентификация на основе ключей), поэтому ps и netstat доступны со всех узлов.

  4. Подходит только для Linux "хаки", не обязательно быть переносимым, хотя это, конечно, дополнительный бонус.

  5. Пользователь всегда будет одним и тем же, и моя команда / скрипт выполняется под этим пользователем. Этот пользователь не root.

  6. Не обязательно быть быстрым, только точным.

Самопроизвольным решением было бы написать клон pstree, который запускается в командной строке "ssh", вычисляет порт источника, а затем идет к рассматриваемому удаленному компьютеру и выясняет, какой из sshd детей, которые были созданы этой конкретной командой.

Но, может быть, есть более умный способ? : P

1 Ответ

1 голос
/ 09 февраля 2010

На самом деле, я думаю, что ваше спонтанное решение - верный способ сделать это: используйте netstat, чтобы получить исходный порт и найти его на удаленной машине. У вас могут возникнуть проблемы с использованием «netstat -p» без полномочий root - я пробовал его на двух машинах, одна из которых была счастлива показать мне свои собственные процессы, а другая - нет.

Как и клиенты ssh, вы можете расширить это, чтобы искать другие клиенты, которые используют ssh-соединения, такие как rsync или Mercurial. Только будьте осторожны, чтобы не отслеживать рекурсивное соединение вашей программы!

Быстрый эксперимент с netstat и pstree показывает, что идея является разумной:

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

Мне было бы интересно увидеть результат, потому что он был бы очень полезен для меня!

...