it-swarm.com.de

Was ist der einfachste Weg zu SSH mit Python?

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.

78

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.

39
ThomasH

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 .)

60
hughdbrown

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.

24
Neil

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)
17
Sebastian Noack

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.

8
Cascabel

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

6
juanjux

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)
6

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.

3
oceanuz

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
1
Naveen

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.load_system_Host_keys ()

ssh.set_missing_Host_key_policy (paramiko.AutoAddPolicy ())

versuchen:

Hier stellen wir tatsächlich eine Verbindung zum Server her.

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')

Hier lesen wir die Zeilen aus der Ausgabe.

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)
0
Harshan Gowda

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)
0
marko.ristin