Implementieren Sie eine interaktive shell über ssh mit Python Paramiko?
Ich möchte ein Programm schreiben (in Python 3.x auf Windows 7), führt mehrere Befehle auf einem remote-shell über ssh. Nach einem Blick auf paramikos' exec_command()
Funktion, merkte ich, dass es nicht geeignet für meinen Anwendungsfall (weil der Kanal geschlossen wird, nachdem der Befehl ausgeführt wird), wie die Befehle hängen von environment-Variablen (durch Vorherige Befehle) und können nicht verkettet werden zu einem exec_command()
nennen, wie Sie ausgeführt werden sollen, die zu verschiedenen Zeiten im Programm.
So, ich will um Befehle auszuführen, die in dem gleichen Kanal. Die nächste option, die ich sah, war in der Umsetzung eine interaktive shell, mit paramikos' invoke_shell()
Funktion:
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()
Gibt es einige Probleme mit diesem code:
- Die ersten
print
nicht immer drucken Sie diels
Ausgang (manchmal ist es nur gedruckt auf der zweitenprint
). - Die ersten
cd
undls
Befehle werden immer im Ausgabe - (ich bekomme Sie über dierecv
Befehl, als Teil der Ausgabe), während alle folgendencd
undls
Befehle gedruckt werden, manchmal, und manchmal sind Sie nicht. - Der zweiten und Dritten
cd
undls
Befehle (beim drucken) erscheinen immer vor dem erstenls
Ausgabe.
Ich bin verwirrt mit dieser "nicht-Determinismus" und würde sehr dankbar für Ihre Hilfe.
- Sie erhalten weitere Hilfe, wenn ersetzen das tag mit den wenigsten Anhängern mit einem python-tag, vorausgesetzt, es ist wirklich python-code. viel Glück.
- Haben Sie verwenden, um
paramiko
? Ich fand es viel einfacher, mit zu arbeitenfabric
. Sie gerade eingerichtetenv
Variablen wieuser
,password
undhost_string
und dann kann man verschiedene Dinge tun, wie zu verwenden:get
zum herunterladen von Dateien vom remote-host,put
um Dateien zu senden undrun
Befehle. Sie können Kette von Befehlen wie zum Beispiel:run('cd .. && cd simulator && ls')
. - leider Stoff ist nicht kompatibel mit python 3.x es ist also keine option. Wie auch immer, von dem, was ich sah, Stoff ist nur ein wrapper um paramiko und nicht lassen Sie mich laufen "nicht-Chain" - Befehle in den gleichen Kanal. Es gibt eine Menge von Logik, die ich letztlich ausführen wollen, die zwischen der shell-Befehle.
- sorry, habe ich übersehen, dass Sie arbeiten mit Python 3.x
- check out netmiko Es ist spezialisiert für Netzwerk-Geräte, aber Sie können es auch mit Linux. Es funktioniert auf Python 3 und basiert auf Paramiko, aber mit der großen Menge der Pufferung für Sie
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin im Grunde mit allen Ihren code und nur das hinzufügen einer for-Schleife:
Führt er 2 Befehle mit dem richtigen Ausgang, aber dann sitzt nur da. Ich wundere mich, wenn muss ich anrufen del irgendwo im code.