client = paramiko.SSHClient()
stdin, stdout, stderr = client.exec_command(command)
Gibt es eine Möglichkeit, den Befehlsrückgabecode zu erhalten?
Es ist schwer alle stdout/stderr zu analysieren und zu wissen, ob der Befehl erfolgreich abgeschlossen wurde oder nicht.
SSHClient ist eine einfache Wrapper-Klasse, die sich auf die untergeordneten Funktionen in Paramiko bezieht. Die API-Dokumentation listet eine recv_exit_status () - Methode in der Channel-Klasse auf.
Ein sehr einfaches Demonstrationsskript:
$ cat sshtest.py
import paramiko
import getpass
pw = getpass.getpass()
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.WarningPolicy())
client.connect('127.0.0.1', password=pw)
while True:
cmd = raw_input("Command to run: ")
if cmd == "":
break
chan = client.get_transport().open_session()
print "running '%s'" % cmd
chan.exec_command(cmd)
print "exit status: %s" % chan.recv_exit_status()
client.close()
$ python sshtest.py
Password:
Command to run: true
running 'true'
exit status: 0
Command to run: false
running 'false'
exit status: 1
Command to run:
$
Ein viel einfacheres Beispiel, bei dem die Kanalklasse nicht direkt aufgerufen wird:
import paramiko
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect('blahblah.com')
stdin, stdout, stderr = client.exec_command("uptime")
print stdout.channel.recv_exit_status() # status is 0
stdin, stdout, stderr = client.exec_command("oauwhduawhd")
print stdout.channel.recv_exit_status() # status is 127
Vielen Dank für JanC, ich habe einige Modifikationen für das Beispiel hinzugefügt und in Python3 getestet.
import paramiko
import getpass
pw = getpass.getpass()
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.WarningPolicy())
#client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
def start():
try :
client.connect('127.0.0.1', port=22, username='ubuntu', password=pw)
return True
except Exception as e:
#client.close()
print(e)
return False
while start():
key = True
cmd = input("Command to run: ")
if cmd == "":
break
chan = client.get_transport().open_session()
print("running '%s'" % cmd)
chan.exec_command(cmd)
while key:
if chan.recv_ready():
print("recv:\n%s" % chan.recv(4096).decode('ascii'))
if chan.recv_stderr_ready():
print("error:\n%s" % chan.recv_stderr(4096).decode('ascii'))
if chan.exit_status_ready():
print("exit status: %s" % chan.recv_exit_status())
key = False
client.close()
client.close()
In meinem Fall war Ausgabepufferung das Problem. Aufgrund der Pufferung werden die Ausgaben der Anwendung nicht blockierungsfrei ausgegeben. Die Antwort zum Drucken von Ausgaben ohne Pufferung finden Sie hier: Ausgabepufferung deaktivieren . Führen Sie einfach Python mit der Option -u wie folgt aus:
> python -u script.py