SSH-Verbindungen parallel absetzen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
snakemake
User
Beiträge: 32
Registriert: Sonntag 6. Juni 2010, 19:20

Hallo,

ich hab folgendes Szenario:

Ich bin auf Host LOCAL, es gibt einen SERVER und zwei Router A und B. Ich will nun von LOCAL aus per SSH den Routern A und B GLEICHZEITIG den Befehl senden, dass sie sich mit einem Prozess auf SERVER verbinden sollen. Dadurch starten A und B gleichzeitig eine Verbindung zu SERVER, was ich erreichen will. Ich müsste in meiem Programm dann noch warten, bis beide Verbindungen terminieren, um weiterzumachen.

Ich weiß, wie ich das in Bash machen könnte (mit & den Prozess in den einen Client im Hintergrund laufen lassen, parallel den zweiten Client laufen lassen und wenn der zweite fertig ist mittels wait pid auf den ersten warten, da die clients ja nicht zur genausten millisekunde gleichzeitig gestartet werden können). Aber ich muss es in Python machen.

Kann mir jemand helfen?
BlackJack

@snakemake: Wenn Du weisst wie es in der Shell mit ``&`` geht, dann sollte das `subprocess`-Modul doch eigentlich alles sein was Du brauchst!? Die Prozesse werden ja im Normalfall dort schon asynchron gestartet.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Dann werf ich mal `pssh` in den Raum.
snakemake
User
Beiträge: 32
Registriert: Sonntag 6. Juni 2010, 19:20

cofi hat geschrieben:Dann werf ich mal `pssh` in den Raum.
pssh geht aber davon aus, dass der Befehl, den ich parallel an alle Hosts sende, gleich ist. Aber bei mir unterscheidet sich der Befehl. Sie haben zwar immer denselben Server, aber A und B von verschiedenen WLAN-Karten und das muss ich im Befehl mit angeben.

EDIT: Zumindestens habe ich die Manpage zu pssh so verstanden und nirgends eine Option gesehen, mit der man unterschiedliche Befehle parallel ausführen kann.

EDIT 2: Übrigens handelt es sich hier bei den Prozessen um Iperf-Clients.
Zuletzt geändert von snakemake am Mittwoch 16. Februar 2011, 10:24, insgesamt 2-mal geändert.
snakemake
User
Beiträge: 32
Registriert: Sonntag 6. Juni 2010, 19:20

BlackJack hat geschrieben:@snakemake: Wenn Du weisst wie es in der Shell mit ``&`` geht, dann sollte das `subprocess`-Modul doch eigentlich alles sein was Du brauchst!? Die Prozesse werden ja im Normalfall dort schon asynchron gestartet.
Ich weiß, so hab ich das auch zuerst implementiert, aber das sieht etwas räudig aus, wenn ich in meinem Code plötzlich mehrere Zeilen Bash-Code habe. Wenn ich dann statt zwei drei Verbindungen nehmen will, dann müsste ich gezielt den Bash Code ändern, und das ist lästig, da das Projekt, in dem sich mein Coe bfindet, nicht gerade klein ist und nicht jeder, der die Datei nutzt, Bash kann.

Also ich dachte auch an Threads. Der erste Client wird in einem neuen Thread gestartet, der zweite Client läuft normal in meinem main-Thread und wenn der fertig ist, mache ich einen join auf den ersten Thread, falls der noch nicht fertig ist.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das haettest du erwaehnen, sollen, dass die unterschiedlich sind ;)

`subprocess` kann das von alleine, du brauchst da keine Shell Befehle.
Mal als Anregung:

Code: Alles auswählen

commands = [["ssh", "foo", "bar"], ["ssh", "bar", "baz"]]
procs = map(subprocess.Popen, commands)
for p in procs:
    p.wait()
BlackJack

@snakemake: Du sollst ja auch keinen Bash-Quelltext in Dein Programm einbauen -- wo habe ich *das* denn vorgeschlagen?
snakemake
User
Beiträge: 32
Registriert: Sonntag 6. Juni 2010, 19:20

BlackJack hat geschrieben:@snakemake: Wenn Du weisst wie es in der Shell mit ``&`` geht, dann sollte das `subprocess`-Modul doch eigentlich alles sein was Du brauchst!? Die Prozesse werden ja im Normalfall dort schon asynchron gestartet.
Ich habe aus dieser Aussage verstanden, dass du sagtest, wenn ich weiß, wie es in Bash geht, dann kann ich die Bash-Befehle doch mit subprpcess absetzen... Sorry, dann hab ich das falsch verstanden.

Werde gleich mal die Idee von cofi testen :)
snakemake
User
Beiträge: 32
Registriert: Sonntag 6. Juni 2010, 19:20

@cofi

Vielen Dank, es hat super geklappt :o :o :o ! Ich kriege zwar die Meldung

"ControlSocket <...> already exists, disabling multiplexing"

aber die ist harmlos, weil das eher mit einem Optimierungsversuch von ssh zu tun hat.

DANKE! :P
Antworten