Mit pexpect und SSH auf anderer Maschine arbeiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

Ich möchte mit Python eine SSH-Verbindung (punlic key) zu einer anderen Maschine aufbauen und dort einige Kommandos ausführen. Das pexpect-Modul scheint genau dafür geschaffen zu sein, ich hab aber ein paar kleine Problemchen. Mein Code schaut bisher folgendermaßen aus:

Code: Alles auswählen

cmd = "ssh testmaschine.de"
child = pexpect.spawn(cmd)
child.expect("#", timeout=5)
child.sendline("uname -r")
child.expect("#", timeout=5)
print child.before
child.sendline("exit")
child.close()
Wenn ich dieses Python-Script aufrufe, schreibt er mir zunächst "uname -r" auf den Bildschirm und dann den Output von uname -r, also die Kernelversion auf der entfernten Maschine, danach sehe ich den Prompt der entfernten Maschine und dann wieder meinen lokalen Prompt. Danach ist die gesamte Schrift in meinem Gnome-Terminal komplett blau, da auf der entfernten Maschine der Prompt blau gesetz ist. Das ganze sieht in etwa so aus:

Code: Alles auswählen

LOCALPROMPT>python meinscript.py
 uname -r
2.6.9-023-smp

REMOTEPROMPT>

LOCALPROMPT>
Was mich aber stört ist das "uname -r" auf dem Bildschirm geprintet wird und das ich den entfernten Prompt sehe ... sollte das nicht "im Hintergrund" geschehen? Ich will als einzige Ausgabe den Output von "uname -r" haben.

Ein zweites kleines Problem ist noch das ich ja nach jedem Kommando mit "child.expect(prompt) auf den Prompt warten muss - was mache ich aber wenn ich gar nicht weiß wie der Prompt auf der entfernten Maschine aussieht?

Vielen Dank für eure Hilfe!
Tom
el3ktro
User
Beiträge: 13
Registriert: Dienstag 15. Mai 2007, 23:38

Ich habe soeben das Module pxssh gefunden, ein Teil von pexpect der speziell zur Kontrolle von SSH gedacht ist. Damit funktioniert es schon deutlich besser, allerdings sehe ich in der Ausgabe immernoch den Befehl den ich sende, also uname -r in meinem Fall. Ich vermute das kommt von dem print child.before oder? Wie kann man das umgehen?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ich habe auch mal eine Verbindung ueber ssh implementiert, allerdings ohne pexpect. Da hatte ich auch immer das Problem, dass man beim Lesen vom pty als erste Zeile wieder den Befehl hat. (Genauer: Der Befehl wurde anscheinend gar nicht erst ausgefuehrt, bevor ich diese Befehlszeile nicht wieder zurueckgelesen hatte). Ich habe dann einfach immer als erstes ein readline gemacht und die Rueckgabe davon ignoriert, dann erst die Ausgabe gelesen.

Vielleicht hilft dir das ja:
http://www.python-forum.de/topic-6245.html
Antworten