web-dev-qa-db-fra.com

Exécutez une commande sur la machine distante dans Python

J'écris un programme en python sur Ubuntu, pour exécuter une commande ls -l sur RaspberryPi, connectez-vous au réseau.

Quelqu'un peut-il me guider sur la façon de procéder?

16
Irfan Ghaffar7

Bien sûr, il y a plusieurs façons de le faire!

Disons que vous avez un Raspberry Pi sur un raspberry.lan Hôte et votre nom d'utilisateur est irfan.

sous-processus

C'est la bibliothèque par défaut Python qui exécute les commandes.
Vous pouvez le faire exécuter ssh et faire tout ce dont vous avez besoin sur un serveur distant.

scrat a-t-il couvert dans sa réponse . Vous devriez certainement le faire si vous ne souhaitez pas utiliser de bibliothèques tierces.

Vous pouvez également automatiser la saisie du mot de passe/phrase de passe à l'aide de pexpect .

paramiko

paramiko est une bibliothèque tierce qui ajoute la prise en charge du protocole SSH, afin qu'elle puisse fonctionner comme un client SSH.

L'exemple de code qui se connecterait au serveur, exécuterait et récupérerait les résultats de ls -l la commande ressemblerait à ça:

import paramiko

client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect('raspberry.lan', username='irfan', password='my_strong_password')

stdin, stdout, stderr = client.exec_command('ls -l')

for line in stdout:
    print line.strip('\n')

client.close()

en tissu

Vous pouvez également y parvenir en utilisant fabric .
Fabric est un outil de déploiement qui exécute diverses commandes sur des serveurs distants.

Il est souvent utilisé pour exécuter des choses sur un serveur distant, vous pouvez donc facilement mettre votre dernière version de l'application Web, redémarrer un serveur Web et ainsi de suite avec une seule commande. En fait, vous pouvez exécuter la même commande sur plusieurs serveurs, ce qui est génial!

Bien qu'il ait été conçu comme un outil de déploiement et de gestion à distance, vous pouvez toujours l'utiliser pour exécuter des commandes de base.

# fabfile.py
from fabric.api import *

def list_files():
    with cd('/'):  # change the directory to '/'
        result = run('ls -l')  # run a 'ls -l' command
        # you can do something with the result here,
        # though it will still be displayed in fabric itself.

C'est comme taper cd / et ls -l sur le serveur distant, vous obtiendrez ainsi la liste des répertoires dans votre dossier racine.

Exécutez ensuite dans le shell:

fab list_files

Il vous demandera une adresse de serveur:

No hosts found. Please specify (single) Host string for connection: [email protected]

Une note rapide : Vous pouvez également attribuer un nom d'utilisateur et un droit d'hôte dans une commande fab:

fab list_files -U irfan -H raspberry.lan

Ou vous pouvez mettre un hôte dans le env.hosts variable dans votre fabfile. Voici comment faire .


Ensuite, vous serez invité à entrer un mot de passe SSH:

[[email protected]] run: ls -l
[[email protected]] Login password for 'irfan':

Et puis la commande sera exécutée avec succès.

[[email protected]] out: total 84
[[email protected]] out: drwxr-xr-x   2 root root  4096 Feb  9 05:54 bin
[[email protected]] out: drwxr-xr-x   3 root root  4096 Dec 19 08:19 boot
...
36
000

Exemple simple de ici :

import subprocess
import sys

Host="www.example.org"
# Ports are handled in ~/.ssh/config since we use OpenSSH
COMMAND="uname -a"

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
else:
    print result

Il fait exactement ce que vous voulez: se connecte via ssh, exécute la commande, retourne la sortie. Aucune bibliothèque tierce n'est nécessaire.

12
sashab

Vous pouvez utiliser la méthode ci-dessous avec la commande ssh intégrée à linux/Unix.

   import os
   os.system('ssh username@ip  bash < local_script.sh >> /local/path/output.txt 2>&1')
   os.system('ssh username@ip  python < local_program.py >> /local/path/output.txt 2>&1')
1
Sagar Jagnade