Вопрос

По сути, я пытаюсь написать команду, подобную 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дочерние элементы, порожденные этой конкретной командой.

Но, может быть, есть более хитрый способ?:П

Это было полезно?

Решение

На самом деле, я думаю, что ваше спонтанное решение - правильный способ сделать это:используйте 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top