2010-02-08 4 views
5

Ich versuche im Grunde, einen PStree-ähnlichen Befehl zu schreiben, außer dass es Prozesse auf Maschinen folgen sollte.Folgen Sie pds über Maschinen (SSH)

Was ich meine ist, dass, wenn ich dies auszuführen:

$ ssh $node sleep 1000 

Dann sollte der Befehl etwa wie folgt angezeigt:

ssh $node -- ($node) sleep 1000 

Und wenn ich laufen:

$ ssh $node ssh $node sleep 1000 

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

Und so weiter ...

Meine Frage lautet: Wie kann ich eine SSH-Sitzung auf einem Computer einem erstellten Prozess auf einem anderen Computer zuordnen?

Lokale Parent-Child-Prozesse sind kein Problem, aber wie kann ich herausfinden, welcher ssh-Befehl auf einem Knoten einen anderen Prozess auf einem anderen Knoten ausgelöst hat?

  1. Linux 2.6.18

  2. nur openSSH für "remote" stuff. OpenSSH_4.3p2 läuft derzeit.

  3. SSH Zugriff auf alle Knoten natürlich (key-basierte Auth) so ps und netstat sind von allen Knoten verfügbar.

  4. Linux-nur "Hacks" sind in Ordnung, muss nicht tragbar sein, obwohl das natürlich ein zusätzlicher Bonus wäre.

  5. Der Benutzer wird immer derselbe sein und mein Befehl/Skript wird als dieser Benutzer ausgeführt. Dieser Benutzer ist nicht root.

  6. Muss nicht schnell sein, nur genau.

Die spontane Lösung einen pstree Klon schreiben würde, die auf der Befehlszeichenfolge „ssh“ auslöst, Zahlen, die Quelle-Port aus und geht dann zu dem Remote-Rechner in Frage und findet heraus, welche von sshd Kinder, die von diesem bestimmten Befehl hervorgebracht wurde.

Aber vielleicht gibt es einen schlaueren Weg? : P

+0

Ich verstehe die Frage nicht vollständig. Was meinst du mit "Mapping" einer SSH-Sitzung? Möchtest du deine SSH-Sitzung benennen? (Dann ist die schöne Anwendung Bildschirm würde mein Zeiger auf die Lösung) – Karussell

+0

ich die Prozess-ID des Befehls abbilden wollen: „ssh $ node Schlaf 1000“ bis auf die Prozess-ID des Befehls: "Schlaf 1000" auf dem Remote-Rechner ($ Knoten). – user268744

Antwort

1

Eigentlich denke ich, Ihre spontane Lösung ist der richtige Weg, um es zu tun: Verwenden Sie Netstat, um den Quellport zu bekommen und suchen Sie auf dem Remote-Rechner. Du könntest Probleme mit "netstat -p" haben, ohne root zu sein - ich habe es auf zwei Maschinen versucht, eine, die mir meine eigenen Prozesse zeigte und eine, die es nicht war.

Ebenso wie ssh-Clients können Sie dies erweitern, um nach anderen Clients zu suchen, die ssh-Verbindungen verwenden, wie rsync oder Mercurial. Achten Sie jedoch darauf, die eigene Verbindung nicht rekursiv zu verfolgen!

Ein kurzer Versuch mit netstat und pstree zeigt, dass die Idee ist Klang:

[email protected]:~$ 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 
[email protected]:~$ ssh remote netstat -p | grep mymachine.example:43681 
tcp  0  0 remote.example.com:ssh mymachine.example:43681 ESTABLISHED 10361/1 
[email protected]:~$ ssh remote pstree -a 10361 
sshd 
    `-grep -n -e wotsit -i -R /local/home/me/somewhere /dev/null 

Ich würde mich interessieren das Ergebnis zu sehen, denn es ist sehr nützlich für mich sein würde!