Frage Was ist der einfachste Weg zu SSH mit Python?


Wie kann ich einfach SSH von einem lokalen Python (3.0) -Skript an einen Remote-Server senden, ein Login / Passwort angeben, einen Befehl ausführen und die Ausgabe an die Python-Konsole ausgeben?

Ich würde lieber keine große externe Bibliothek verwenden oder irgendetwas auf dem entfernten Server installieren.


76
2017-08-05 14:34


Ursprung


Antworten:


Ich habe es nicht versucht, aber das hier pysftp Modul könnte helfen, die wiederum Paramiko verwendet. Ich glaube, alles ist clientseitig.

Der interessante Befehl ist wahrscheinlich .execute() was einen beliebigen Befehl auf dem entfernten Rechner ausführt. (Das Modul bietet auch .get() und .put Methoden, die mehr auf seinen FTP Charakter beziehen).

AKTUALISIEREN:

Ich habe die Antwort neu geschrieben, nachdem der Blogpost, mit dem ich ursprünglich verlinkt habe, nicht mehr verfügbar ist. Einige der Kommentare, die sich auf die alte Version dieser Antwort beziehen, werden jetzt seltsam aussehen.


38
2017-08-05 14:49



Sie können es mit Paramiko selbst programmieren, wie oben vorgeschlagen. Alternativ können Sie in Fabric, einer Python-Anwendung, nachsehen, um all die Dinge zu tun, nach denen Sie gefragt haben:

Fabric ist eine Python-Bibliothek und   Befehlszeilentool für   rationalisieren Sie die Bereitstellung von Anwendungen oder   Durchführen von Systemverwaltungsaufgaben   über das SSH-Protokoll. Es bietet   Werkzeuge zum Ausführen beliebiger Shells   Befehle (entweder als normale Anmeldung   Benutzer oder über sudo), Hochladen und   Herunterladen von Dateien und so weiter.

Ich denke, das passt zu Ihren Bedürfnissen. Es ist auch keine große Bibliothek und erfordert keine Serverinstallation, obwohl es Abhängigkeiten zu paramiko und pycrypt hat, die eine Installation auf dem Client erfordern.

Die App war einmal Hier. Es kann jetzt gefunden werden Hier.

* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric

Es gibt einige gute Artikel darüber, aber Sie sollten vorsichtig sein, weil es sich in den letzten sechs Monaten geändert hat:

Bereitstellen von Django mit Fabric

Werkzeuge des modernen Python-Hackers: Virtualenv, Fabric und Pip

Einfache und einfache Bereitstellung mit Fabric und Virtualenv


Später: Fabric benötigt zur Installation nicht mehr paramiko:

$ 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 hauptsächlich kosmetischer Natur: ssh ist eine Abzweigung von paramiko, der Betreuer für beide Bibliotheken ist derselbe (Jeff Forcier, auch der Autor von Fabric) und Der Maintainer plant paramiko und ssh unter dem Namen paramiko zu vereinen. (Diese Korrektur über pbanka.)


60
2017-08-05 15:00



Wenn Sie zusätzliche Module vermeiden möchten, können Sie das Unterprozessmodul zum Ausführen 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 umzugehen, können Sie den Subprozess verwenden, um mit dem SSH-Prozess zu interagieren, oder Sie können einen öffentlichen Schlüssel auf dem Server installieren, um die Kennwortabfrage zu vermeiden.


22
2017-08-05 15:05



Ich habe geschrieben Python-Bindungen für libssh2. 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)

16
2018-02-28 12:51



Ihre Definition von "einfachste" ist hier wichtig - einfacher Code bedeutet, ein Modul zu verwenden (obwohl "große externe Bibliothek" eine Übertreibung ist).

Ich glaube das aktuellste (aktiv entwickelte) Modul ist Paramiko. Es enthält Demoskripte im Download und eine ausführliche Online-API-Dokumentation. Du könntest es auch versuchen PxSSH, die in enthalten ist pexpect. Es gibt eine kurze Probe zusammen mit der Dokumentation beim ersten Link.

Auch in Bezug auf die Einfachheit, beachten Sie, dass eine gute Fehlererkennung Ihren Code immer komplexer erscheinen lässt, aber Sie sollten in der Lage sein, viel Code aus den Beispielskripten wiederzuverwenden und dann zu vergessen.


8
2017-08-05 14:44



Wie Hugh Brown, ich mag Stoff. Bitte beachten Sie, dass es zwar ein eigenes deklaratives Scripting implementieren kann (um Deployen und ähnliches zu erstellen), 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 überarbeitet. Das bedeutet, dass die meisten Lernprogramme, die Sie (derzeit) im Internet finden, nicht mit der aktuellen Version funktionieren. Außerdem zeigt Google immer noch die alte Fabric-Seite als erstes Ergebnis an.

Für eine aktuelle Dokumentation können Sie Folgendes überprüfen: http://docs.fabfile.org


6
2017-08-06 10:08



Ich fand Paramiko etwas zu niedrig und Fabric nicht besonders gut geeignet, um als Bibliothek benutzt zu werden Sporn das benutzt paramiko, um eine etwas nettere Schnittstelle zu implementieren:

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 festlegen, dass die Ausgabe des Programms während der Ausführung gedruckt wird. Dies ist nützlich, wenn Sie die Ausgabe lang laufender Befehle anzeigen möchten, bevor sie beendet wird:

result = shell.run(["echo", "-n", "hello"], stdout=sys.stdout)

6
2018-01-10 21:47



Das hat für mich 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

1
2017-12-22 08:51



Zum Vorteil derer, die hier für Python-ssh-Probe googlen. Die ursprüngliche Frage und Antwort sind jetzt fast schon ein Decode. Es scheint, dass das Paramiko ein bisschen Funktionalität bekommen hat (Ok. Ich gebe es zu - rein raten hier - 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 Demo von angepasst https://github.com/paramiko/paramiko Für mich geht das.


1
2018-06-21 11:09