88 votes

Quel est le moyen le plus simple de SSH en utilisant Python ?

Comment puis-je simplement me connecter en SSH à un serveur distant depuis un script Python (3.0) local, fournir un login/mot de passe, exécuter une commande et imprimer la sortie sur la console Python ?

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

63voto

hughdbrown Points 15770

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

Fabric est une bibliothèque Python et outil en ligne de commande conçu pour simplifier le déploiement d'applications ou l'exécution de tâches d'administration système via le protocole SSH. Elle fournit des outils permettant d'exécuter un shell arbitraire arbitraires (soit en tant qu'utilisateur normal ou via sudo), de télécharger des fichiers, etc. télécharger des fichiers, et ainsi de suite.

Je pense que cela correspond à vos besoins. Ce n'est pas non plus une grosse bibliothèque et elle ne nécessite aucune installation sur le serveur, bien qu'elle ait des dépendances sur paramiko et pycrypt qui nécessitent une installation sur le client.

L'application était aquí . Il peut maintenant être trouvé aquí .

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

Il existe plusieurs bons articles sur le sujet, mais il faut faire attention car il a changé au cours des six derniers mois :

Déploiement de Django avec Fabric

Les outils du hacker moderne en Python : Virtualenv, Fabric et Pip

Déploiement simple et facile avec Fabric et Virtualenv


Plus tard : Fabric ne nécessite plus l'installation de 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...

Il s'agit cependant d'un aspect essentiellement cosmétique : ssh est un fork de paramiko, le mainteneur des deux bibliothèques est le même (Jeff Forcier, également auteur de Fabric), et le mainteneur a prévu de réunir paramiko et ssh sous le nom de paramiko . (Cette correction via pbanka .)

0 votes

Comme ce lien semble intéressant, j'aimerais le mettre à jour car le vôtre est maintenant cassé. Veuillez l'utiliser : clemesha.org/blog/

0 votes

Le demandeur n'a-t-il pas précisé qu'il ne voulait pas utiliser une "grande bibliothèque externe" ? Paramiko et Fabric sont tous deux exagérés alors que l'auteur n'a demandé qu'une simple recette ssh unique.

1 votes

@Zoran Pavlovic : toutes les réponses étaient soit d'installer un paquet local (paramiko, fabric, ssh, libssh2) soit d'utiliser un sous-processus pour exécuter ssh. Cette dernière est une solution sans installation, mais je ne pense pas que faire tourner ssh soit une bonne idée, et l'OP non plus puisqu'il a choisi la réponse d'installer le module ssh. Ces docs disent : "ssh.py fournit trois opérations SSH courantes, get, put et execute. C'est une abstraction de haut niveau sur Paramiko". Donc, à moins que vous ne préfériez libssh2, qui est lourd à coder, il n'y a pas de recommandation conforme. Je préfère donner une bonne solution lorsque les conditions du PO ne peuvent pas être raisonnablement satisfaites.

43voto

ThomasH Points 6597

Je ne l'ai pas essayé, mais cette pysftp pourrait vous 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 .get() y .put qui font davantage allusion à son caractère FTP).

UPDATE :

J'ai réécrit la réponse après que l'article de blog dont j'ai fait le lien à l'origine n'est plus disponible. Certains des commentaires qui font référence à l'ancienne version de cette réponse seront maintenant bizarres.

0 votes

Bonne trouvaille ! Tant que vous ne vous souciez pas de personnaliser les réponses aux erreurs, cette abstraction supplémentaire serait très utile.

0 votes

Le module ssh a fait l'affaire. Il est simple et fonctionne bien. Pas de recherche dans l'API Paramiko.

2 votes

Le lien vers le fichier ssh.py dans le lien que vous avez donné est cassé :/

29voto

Neil Points 1304

Si vous voulez éviter tout module supplémentaire, 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 subprocess pour interagir avec le processus ssh, ou vous pouvez installer une clé publique sur le serveur pour éviter l'invite de mot de passe.

8 votes

Mais que faire si le client est sous Windows ?

0 votes

Il pourrait être difficile de fournir un mot de passe à ssh sous-processus via un tuyau. Voir Pourquoi ne pas simplement utiliser un tuyau (popen()) ? . Vous pourriez avoir besoin pty , pexpect modules pour le contourner.

0 votes

Ne semble pas fonctionner pour la chaîne de caractères 'ssh somecomputer ; python -c "import numpy ; print numpy.__version__"', il indique qu'il ne connaît pas la commande "import".

18voto

Sebastian Noack Points 458

J'ai écrit Liaisons Python 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)

2 votes

Cela semble très bas. Par exemple (votre propre exemple), vous devez explicitement dire que vous utilisez IPv4 ou IPv6 (ce que vous n'avez pas à faire avec le client en ligne de commande OpenSSH). De plus, je n'ai pas trouvé comment le faire fonctionner avec ssh-agent.

3 votes

L'avantage de pylibssh2 est qu'il transfère les fichiers beaucoup plus rapidement que n'importe quelle implémentation python native de ssh comme paramiko.

8voto

Jefromi Points 127932

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

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X