Antworten:
SSHClient ist eine einfache Wrapper-Klasse, die sich mit den Funktionen auf niedrigerer Ebene in Paramiko befasst. In der API-Dokumentation wird eine recv_exit_status () -Methode für die Channel-Klasse aufgeführt.
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 "unterer Ebene" nicht direkt aufgerufen wird (dh - der client.get_transport().open_session()
Befehl NICHT verwendet 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 Änderungen für das Beispiel hinzugefügt und in Python3 getestet, es ist wirklich nützlich für mich.
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 die Ausgabepufferung das Problem. Aufgrund der Pufferung werden die Ausgaben der Anwendung nicht blockierend ausgegeben. Die Antwort zum Drucken von Ausgaben ohne Pufferung finden Sie hier: Deaktivieren Sie die Ausgabepufferung . Kurz gesagt, führen Sie Python einfach mit der folgenden Option -u aus:
> python -u script.py