python-Modul paramiko hängt an stdout.read()
Ich bin mit dem folgenden code:
import paramiko
def runSshCmd(hostname, username, password, cmd, timeout=None):
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, username=username, password=password,
allow_agent=False, look_for_keys=False, timeout=timeout)
stdin, stdout, stderr = client.exec_command(cmd)
stdin.flush()
data = stdout.read()
print (data)
client.close()
runSshCmd("10.128.12.32", "root", "C0mput3Gr!d", "ts_menu")
wenn es um stdout.read() , es hängt sich auf... manchmal druckt er den Ausgang nach langer Zeit.
Können Sie bitte vorschlagen, wenn etwas getan werden kann über dieses Thema??
Sehe ich dieses Problem wurde gemeldet, in :
https://bugs.python.org/issue24026
Gibt es eine bessere-Modul in python für die ssh-Verbindung und Befehle ausführen ??
Du musst angemeldet sein, um einen Kommentar abzugeben.
Könnte im Zusammenhang mit https://github.com/paramiko/paramiko/issues/109
Unten ist die Erklärung, was ich mich vor und wie ich um ihn herum gearbeitet.
Ich auch erlebt, dieses Problem ist es aufgrund
stdout.Kanal.eof_received == 0
stdin, stdout und stderr sind, offen bleiben...
Also EOF wurde nicht eingegangen...
In der Regel erhalte ich True und kann nur stdout.Lesen(), aber um sicher zu sein habe ich diese Problemumgehung verwenden (was funktioniert!):
Warten Sie, bis ein timeout, Kraft stdout.Kanal.close() und dann stdout.read():
BTW ich benutze:
Hoffe, das hilft...
Ich passiert zu kommen in dieser Ausgabe. Aber ich irgendwie umgehen, indem man mit "readline" statt "readlines".
Beispiel:
Damit es gedruckt wird jede Zeile sofort und nicht mehr hängen, auch exit_status_ready() sicherstellen, dass die Schleife unterbrochen, wenn stdout gestoppt/beendet.
Es verwenden, um passieren, wenn es keine Daten in den stdout oder gibt es eine Zeile, ohne eol (d.h. in einer read-Anweisung in einem sh-script). Versuchen Sie 'get_pty=True', dann Lesen Sie nur die bytes, die in stdout. Endlosschleifen vermeiden, wäre es eine gute Idee, eine timeout-Einstellung und ein Schlaf-trotz der continue-Anweisung: