Wie kann ich einfach von einem lokalen Python (3.0) -Skript aus SSH zu einem Remote-Server erstellen, ein Login/Kennwort eingeben, einen Befehl ausführen und die Ausgabe an die Python-Konsole drucken?
Ich möchte lieber keine große externe Bibliothek verwenden oder auf dem Remote-Server etwas installieren.
Ich habe es nicht ausprobiert, aber dieses pysftp - Modul könnte helfen, das wiederum paramiko verwendet. Ich glaube, dass alles auf Kundenseite liegt.
Der interessante Befehl ist wahrscheinlich .execute()
, der auf dem entfernten Rechner einen beliebigen Befehl ausführt. (Das Modul verfügt auch über die Methoden .get()
und .put
, die sich mehr auf sein FTP-Zeichen beziehen.).
AKTUALISIEREN:
Ich habe die Antwort neu geschrieben, nachdem der ursprünglich veröffentlichte Blogbeitrag nicht mehr verfügbar ist. Einige der Kommentare, die sich auf die alte Version dieser Antwort beziehen, werden jetzt seltsam aussehen.
Sie können ihn wie oben beschrieben mit Paramiko selbst codieren. Alternativ können Sie in Fabric nachsehen, einer Python-Anwendung, mit der Sie all die Dinge erledigen können, nach denen Sie gefragt haben:
Fabric ist eine Python-Bibliothek und Befehlszeilentool für Rationalisieren Sie die Bereitstellung von Anwendungen oder Ausführen von Systemverwaltungsaufgaben über das SSH-Protokoll. Es bietet Tools zum Ausführen beliebiger Shell Befehle (entweder als normaler Login Benutzer oder über Sudo), Hochladen und Herunterladen von Dateien usw.
Ich denke das passt zu deinen Bedürfnissen. Es ist auch keine große Bibliothek und erfordert keine Serverinstallation, obwohl Abhängigkeiten von paramiko und pycrypt bestehen, die auf dem Client installiert werden müssen.
Die App war früher hier . Es kann jetzt hier gefunden werden.
* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric
Es gibt mehrere gute Artikel dazu, obwohl Sie vorsichtig sein sollten, da sich dies in den letzten sechs Monaten geändert hat:
Django mit Fabric bereitstellen
Tools des modernen Python-Hackers: Virtualenv, Fabric und Pip
Einfache und einfache Bereitstellung mit Fabric und Virtualenv
Später: Fabric muss nicht mehr von paramiko installiert werden:
$ pip install fabric
Downloading/unpacking fabric
Downloading Fabric-1.4.2.tar.gz (182Kb): 182Kb downloaded
Running setup.py Egg_info for package fabric
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no files found matching 'fabfile.py'
Downloading/unpacking ssh>=1.7.14 (from fabric)
Downloading ssh-1.7.14.tar.gz (794Kb): 794Kb downloaded
Running setup.py Egg_info for package ssh
Downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric)
Downloading pycrypto-2.6.tar.gz (443Kb): 443Kb downloaded
Running setup.py Egg_info for package pycrypto
Installing collected packages: fabric, ssh, pycrypto
Running setup.py install for fabric
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no files found matching 'fabfile.py'
Installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin
Running setup.py install for ssh
Running setup.py install for pycrypto
...
Successfully installed fabric ssh pycrypto
Cleaning up...
Dies ist jedoch meistens kosmetisch: ssh ist eine Abspaltung von paramiko, der Betreuer beider Bibliotheken ist derselbe (Jeff Forcier, der Autor von Fabric), und der Betreuer plant, paramiko und ssh unter dem Namen paramiko wieder zu vereinen . (Diese Korrektur über pbanka .)
Wenn Sie zusätzliche Module vermeiden möchten, können Sie das Unterprozessmodul zur Ausführung verwenden
ssh [Host] [command]
und erfassen Sie die Ausgabe.
Versuchen Sie etwas wie:
process = subprocess.Popen("ssh example.com ls", Shell=True,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output
Um mit Benutzernamen und Kennwörtern umgehen zu können, können Sie einen Unterprozess verwenden, um mit dem ssh-Prozess zu interagieren, oder Sie können einen öffentlichen Schlüssel auf dem Server installieren, um die Kennwortaufforderung zu vermeiden.
Ich habe Python-Bindungen für libssh2 geschrieben. Libssh2 ist eine clientseitige Bibliothek, die das SSH2-Protokoll implementiert.
import socket
import libssh2
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('exmaple.com', 22))
session = libssh2.Session()
session.startup(sock)
session.userauth_password('john', '******')
channel = session.channel()
channel.execute('ls -l')
print channel.read(1024)
Ihre Definition von "einfachster" ist hier wichtig - einfacher Code bedeutet die Verwendung eines Moduls (obwohl "große externe Bibliothek" eine Übertreibung ist).
Ich glaube, das aktuellste (aktiv entwickelte) Modul ist paramiko . Es enthält Demo-Skripts im Download und eine detaillierte Online-API-Dokumentation. Sie können auch PxSSH versuchen, das in pexpect enthalten ist. Es gibt ein kurzes Beispiel mit der Dokumentation unter dem ersten Link.
Im Hinblick auf die Einfachheit ist zu beachten, dass eine gute Fehlererkennung Ihren Code immer komplexer erscheinen lässt. Sie sollten jedoch eine Menge Code aus den Beispielskripts wiederverwenden und ihn dann vergessen.
Wie Hughdbrown mag ich Fabric. Bitte beachten Sie, dass das Programm zwar eigene deklarative Skripts implementiert (für Implementierungen und dergleichen), aber auch als Python-Modul importiert und in Ihren Programmen verwendet werden kann, ohne ein Fabric-Skript schreiben zu müssen.
Fabric hat einen neuen Betreuer und wird gerade umgeschrieben; Das bedeutet, dass die meisten Tutorials, die Sie (derzeit) im Web finden, nicht mit der aktuellen Version funktionieren. Außerdem zeigt Google immer noch die alte Fabric-Seite als erstes Ergebnis.
Aktuelle Dokumentation finden Sie unter: http://docs.fabfile.org
Ich fand, dass Paramiko ein bisschen zu niedrig ist, und Fabric ist nicht besonders gut geeignet, um als Bibliothek verwendet zu werden. Deshalb habe ich meine eigene Bibliothek namens spur zusammengestellt, die mit paramiko eine etwas schönere Schnittstelle implementiert:
import spur
Shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = Shell.run(["echo", "-n", "hello"])
print result.output # prints hello
Sie können auch auswählen, ob die Ausgabe des Programms während der Ausführung gedruckt werden soll. Dies ist hilfreich, wenn Sie die Ausgabe langlaufender Befehle anzeigen möchten, bevor sie beendet wird:
result = Shell.run(["echo", "-n", "hello"], stdout=sys.stdout)
Zum Nutzen derer, die hier nach Python suchen. Ssh sample . Die ursprüngliche Frage und Antwort ist fast schon eine Dekodierung alt . Es scheint, dass das Paramiko ein bisschen an Funktionalität gewonnen hat (Ok. Ich gebe zu - hier nur raten - ich bin neu in Python) und Sie können ssh-Client direkt mit paramiko erstellen.
import base64
import paramiko
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.1.1', username='user', password='password')
stdin, stdout, stderr = client.exec_command('cat /proc/meminfo')
for line in stdout:
print('... ' + line.strip('\n'))
client.close()
Dieser Code wurde von der Demo von https://github.com/paramiko/paramiko .__ angepasst und funktioniert für mich.
Das hat bei mir funktioniert
import subprocess
import sys
Host="IP"
COMMAND="ifconfig"
def passwordless_ssh(Host):
ssh = subprocess.Popen(["ssh", "%s" % Host, COMMAND],
Shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if result == []:
error = ssh.stderr.readlines()
print >>sys.stderr, "ERROR: %s" % error
return "error"
else:
return result
please refer to paramiko.org, its very useful while doing ssh using python.
paramiko importieren
importzeit
ssh = paramiko.SSHClient () #SSHClient () ist das paramiko-Objekt
'' 'Unterhalb der Zeilen wird der Serverschlüssel automatisch zur Datei' 'know_hosts' 'hinzugefügt.
ssh.set_missing_Host_key_policy (paramiko.AutoAddPolicy ())
versuchen:
ssh.connect('10.106.104.24', port=22, username='admin', password='')
time.sleep(5)
I have mentioned time because some servers or endpoint prints there own information after loggin in e.g. the version, model and uptime information, so its better to give some time before executing the command.
Here we execute the command, stdin for input, stdout for output, stderr for error
stdin, stdout, stderr = ssh.exec_command('xstatus Time')
output = stdout.readlines()
print(output)
Below all are the Exception handled by paramiko while ssh. Refer to paramiko.org for more information about exception.
except (BadHostKeyException, AuthenticationException,
SSHException, socket.error) als e:
print(e)
Werfen Sie einen Blick auf spurplus , einen Wrapper um spur und paramiko , den wir entwickelt haben, um entfernte Maschinen zu verwalten und Dateioperationen auszuführen.
Spurplus bietet standardmäßig eine check_output()
-Funktion:
import spurplus
with spurplus.connect_with_retries(
hostname='some-machine.example.com', username='devop') as Shell:
out = Shell.check_output(['/path/to/the/command', '--some_argument'])
print(out)