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:

  1. Die ersten print nicht immer drucken Sie die ls Ausgang (manchmal ist es nur gedruckt auf der zweiten print).
  2. Die ersten cd und ls Befehle werden immer im Ausgabe - (ich bekomme Sie über die recv Befehl, als Teil der Ausgabe), während alle folgenden cd und ls Befehle gedruckt werden, manchmal, und manchmal sind Sie nicht.
  3. Der zweiten und Dritten cd und ls Befehle (beim drucken) erscheinen immer vor dem ersten ls 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 arbeiten fabric. Sie gerade eingerichtet env Variablen wie user, password und host_string und dann kann man verschiedene Dinge tun, wie zu verwenden: get zum herunterladen von Dateien vom remote-host, put um Dateien zu senden und run 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
InformationsquelleAutor misha | 2016-03-05
Schreibe einen Kommentar