web-dev-qa-db-fra.com

Quel est le moyen le plus simple de SSH avec Python?

Comment puis-je simplement SSH sur un serveur distant à partir d'un script Python (3.0) local, fournir un identifiant/mot de passe, exécuter une commande et imprimer le résultat sur la console Python?

Je préférerais ne pas utiliser de grande bibliothèque externe ni installer quoi que ce soit sur le serveur distant.

78
Christopher Tokar

Je ne l'ai pas essayé, mais ce module pysftp pourrait aider, qui à son tour utilise paramiko. Je crois que tout est côté client.

La commande intéressante est probablement .execute() qui exécute une commande arbitraire sur la machine distante. (Le module comporte également des méthodes .get() et .put qui font davantage allusion à son caractère FTP).

METTRE À JOUR:

J'ai réécrit la réponse après que le billet de blog auquel je m'étais initialement lié ne soit plus disponible. Certains commentaires faisant référence à l'ancienne version de cette réponse auront maintenant un aspect bizarre.

39
ThomasH

Vous pouvez le coder vous-même en utilisant Paramiko, comme suggéré ci-dessus. Vous pouvez également utiliser Fabric, une application python pour faire tout ce que vous avez demandé:

Fabric est une bibliothèque Python et outil de ligne de commande conçu pour rationaliser le déploiement d'applications ou effectuer des tâches d'administration système via le protocole SSH. Il offre outils pour exécuter un shell arbitraire commandes (soit en tant que login utilisateur normal, soit via Sudo), téléchargement et téléchargement de fichiers, etc.

Je pense que cela correspond à vos besoins. Il ne s'agit pas non plus d'une bibliothèque volumineuse et ne nécessite aucune installation de serveur, même si elle a des dépendances sur paramiko et pycrypt qui nécessitent une installation sur le client.

L’application était ici . On peut maintenant le trouver ici .

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

Il existe plusieurs bons articles à ce sujet, mais vous devez être prudent, car il a changé au cours des six derniers mois:

Déploiement de Django avec Fabric

Outils du pirate Python moderne: Virtualenv, Fabric and Pip

Déploiement simple et facile avec Fabric et Virtualenv


Plus tard: Paramiko n’est plus nécessaire pour Fabric:

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

C’est surtout cosmétique: ssh est une fourchette de paramiko, le responsable des deux bibliothèques est identique (Jeff Forcier, également auteur de Fabric), et le responsable envisage de réunir paramiko et ssh sous le nom de paramiko . (Cette correction via pbanka .)

60
hughdbrown

Si vous souhaitez éviter des modules supplémentaires, vous pouvez utiliser le module de sous-processus pour exécuter

ssh [Host] [command]

et capturer la sortie. 

Essayez quelque chose comme:

process = subprocess.Popen("ssh example.com ls", Shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output

Pour gérer les noms d'utilisateur et les mots de passe, vous pouvez utiliser un sous-processus pour interagir avec le processus ssh ou vous pouvez installer une clé publique sur le serveur pour éviter l'invite du mot de passe.

24
Neil

J'ai écrit Python bindings pour libssh2 . Libssh2 est une bibliothèque côté client implémentant le protocole SSH2.

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

Votre définition de "plus simple" est importante ici - un code simple signifie utiliser un module (bien que "une grande bibliothèque externe" soit une exagération).

Je crois que le module le plus récent (développé activement) est paramiko . Il contient des scripts de démonstration dans le téléchargement et une documentation détaillée sur les API en ligne. Vous pouvez également essayer PxSSH , qui est contenu dans pexpect . Il y a un court échantillon avec la documentation au premier lien. 

Toujours en ce qui concerne la simplicité, notez qu’une bonne détection des erreurs rendra votre code plus complexe, mais vous devriez pouvoir réutiliser une grande partie du code des exemples de scripts, puis l’oublier.

8
Cascabel

Comme le brun pâle, j'aime le tissu. Veuillez noter que, tout en implémentant son propre script déclaratif (pour effectuer des déploiements, etc.), il peut également être importé en tant que module Python et utilisé dans vos programmes sans avoir à écrire un script Fabric.

Fabric a un nouveau responsable et est en train d'être réécrit; cela signifie que la plupart des tutoriels que vous trouverez (actuellement) sur le Web ne fonctionneront pas avec la version actuelle. Google affiche toujours l'ancienne page Fabric en premier résultat. 

Pour une documentation à jour, vous pouvez vérifier: http://docs.fabfile.org

6
juanjux

J'ai trouvé que paramiko était un peu trop bas et Fabric ne convenant pas vraiment à être utilisé comme bibliothèque. J'ai donc créé ma propre bibliothèque appelée spur qui utilise paramiko pour implémenter une interface légèrement plus agréable:

import spur

Shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = Shell.run(["echo", "-n", "hello"])
print result.output # prints hello

Vous pouvez également choisir d'imprimer la sortie du programme pendant son exécution, ce qui est utile si vous souhaitez voir la sortie des commandes à exécution longue avant sa fermeture:

result = Shell.run(["echo", "-n", "hello"], stdout=sys.stdout)
6
Michael Williamson

Pour le bénéfice de ceux qui arrivent ici googler pour un échantillon de python ssh ... La question et la réponse d'origine sont presque un vieux décodage maintenant ... Il semble que le paramiko ait gagné un peu de fonctionnalités je ne connais que très peu de Python) et vous pouvez créer un client ssh directement avec paramiko.

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

Ce code a été adapté de la démo de https://github.com/paramiko/paramiko Il fonctionne pour moi.

3
oceanuz

Cela a fonctionné pour moi

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.

importer paramiko

temps d'importation

ssh = paramiko.SSHClient () #SSHClient () est l'objet paramiko

'' 'Au-dessous des lignes ajoute la clé du serveur automatiquement au fichier know_hosts. Utilisez l'un des éléments ci-dessous' ''

ssh.load_system_Host_keys ()

ssh.set_missing_Host_key_policy (paramiko.AutoAddPolicy ())

essayer:

Ici, nous sommes en train de nous connecter au serveur.

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

Ici, nous lisons les lignes de la sortie.

output = stdout.readlines() 

print(output)

Below all are the Exception handled by paramiko while ssh. Refer to paramiko.org for more information about exception.

sauf (BadHostKeyException, AuthenticationException,
SSHException, socket.error) comme e:

print(e)
0
Harshan Gowda

Jetez un œil à spurplus , une enveloppe autour de spur et paramiko que nous avons développée pour gérer les ordinateurs distants et effectuer des opérations sur les fichiers.

Spurplus fournit une fonction check_output() prête à l'emploi:

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