2009-08-21 11 views
7

Ich habe "Python SSH" gegooglet. Es gibt ein wunderbares Modul pexpect, das mit ssh (mit Passwort) auf einen entfernten Computer zugreifen kann.Wie bekomme ich Konsolenausgabe von einem Remote-Computer (SSH + Python)

Nachdem der Remote-Computer angeschlossen ist, kann ich andere Befehle ausführen. Allerdings kann ich das Ergebnis in Python nicht noch einmal erhalten.

p = pexpect.spawn("ssh [email protected]_computer") 
print "connecting..." 
p.waitnoecho() 
p.sendline(my_password) 
print "connected" 
p.sendline("ps -ef") 
p.expect(pexpect.EOF) # this will take very long time 
print p.before 

Wie bekomme ich das Ergebnis von ps -ef in meinem Fall?

+0

hmm? p.before sollte die Ausgabe geben –

+0

Python gibt "None" zurück – stanleyxu2005

Antwort

1

Sie könnten auch untersuchen, paramiko, die eine andere SSH-Bibliothek für Python ist.

+0

Nachdem ich so viele verschiedene Lösungen ausprobiert habe, halte ich diese Bibliothek für die beste Methode. Ich muss sogar keine Nicht-Passwort-Anmeldung konfigurieren, um ein Skript auf fremden Knoten über LAN auszuführen. – stanleyxu2005

1

Try

p.sendline("ps -ef\n") 

IIRC, der Text ist wörtlich interpretiert senden zu senden, so wird der andere Computer wartet wahrscheinlich für Sie den Befehl abzuschließen.

8

Haben Sie einen noch einfacheren Ansatz versucht?

>>> from subprocess import Popen, PIPE 
>>> stdout, stderr = Popen(['ssh', '[email protected]_computer', 'ps -ef'], 
...      stdout=PIPE).communicate() 
>>> print(stdout) 

Zugegeben, dies funktioniert nur, weil ich ssh-agent mit einem privaten Schlüssel vorbelastet läuft, dass die Remote-Host kennt.

+1

Danke für diesen Tipp. Gibt es eine einfache Möglichkeit, private Schlüssel für viele Clients zu konfigurieren? Ich muss jede Woche Log-Dateien von 20 Maschinen überprüfen. Dies ist die Motivation, ein Python-Skript zu schreiben. – stanleyxu2005

+0

Nun ... Sie müssen nur Ihren öffentlichen Schlüssel an ~/.ssh/authorized_keys auf jeder der Maschinen anhängen. Wenn sich Ihre Arbeitsgeräte nicht viel ändern, ist dies vielleicht eine einmalige Übung. BTW, dies ist ein ziemlich netter Artikel über die Einrichtung von SSH-Agent und mehr: http://unixwiz.net/techtips/ssh-agent-forwarding.html –

3
child = pexpect.spawn("ssh [email protected]_computer ps -ef") 
print "connecting..." 
i = child.expect(['[email protected]_computer\'s password:']) 
child.sendline(user_password) 
i = child.expect([' .*']) #or use i = child.expect([pexpect.EOF]) 
if i == 0: 
    print child.after # uncomment when using [' .*'] pattern 
    #print child.before # uncomment when using EOF pattern 
else: 
    print "Unable to capture output" 


Hope this help.. 
Verwandte Themen