Mit Paramiko eine interaktive Shell über ssh in Python implementieren?
Ich möchte ein Programm schreiben (in Python 3.x unter Windows 7), das mehrere Befehle auf einer Remote-Shell über ssh ausführt. Nachdem ich mir die exec_command () - Funktion von paramikos angesehen habe, wurde mir klar, dass sie nicht für meinen Anwendungsfall geeignet ist (da der Kanal nach Ausführung des Befehls geschlossen wird), da die Befehle von Umgebungsvariablen abhängen (die durch vorherige Befehle festgelegt wurden) und nicht sein können zu einem exec_command () -Aufruf verkettet, da sie zu verschiedenen Zeiten im Programm ausgeführt werden sollen.
Daher möchte ich Befehle im selben Kanal ausführen. Die nächste Option, die ich mir ansah, war die Implementierung einer interaktiven Shell mit der Funktion invoke_shell () von paramikos:
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=psw, port=22)
channel = ssh.invoke_shell()
out = channel.recv(9999)
channel.send('cd mivne_final\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
channel.send('cd ..\n')
channel.send('cd or_fail\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
channel.send('cd ..\n')
channel.send('cd simulator\n')
channel.send('ls\n')
while not channel.recv_ready():
time.sleep(3)
out = channel.recv(9999)
print(out.decode("ascii"))
ssh.close()
Es gibt einige Probleme mit diesem Code:
Der erste "Druck" druckt nicht immer die Ausgabe "ls" (manchmal wird er nur beim zweiten "Druck" gedruckt). Die ersten Befehle 'cd' und 'ls' sind immer in der Ausgabe vorhanden (ich erhalte sie über den Befehl 'recv' als Teil der Ausgabe), während alle folgenden Befehle 'cd' und 'ls' manchmal gedruckt werden und manchmal auch nicht.Die zweiten und dritten Befehle 'cd' und 'ls' (wenn gedruckt) erscheinen immer vor der ersten Ausgabe 'ls'.Ich bin mit diesem "Nicht-Determinismus" verwirrt und würde mich sehr über Ihre Hilfe freuen.