Ejecutar un comando en la máquina remota en Python

Estoy escribiendo un progtwig en python en Ubuntu, para ejecutar un comando ls -l en RaspberryPi, conectar con la red.

¿Alguien puede guiarme sobre cómo hago eso?

Claro, hay varias maneras de hacerlo!

Digamos que tienes una Raspberry Pi en un host de raspberry.lan y tu nombre de usuario es irfan .

subproceso

Es la biblioteca de Python predeterminada que ejecuta comandos.
Puede hacer que ejecute ssh y hacer lo que necesite en un servidor remoto.

scrat lo tiene cubierto en su respuesta . Definitivamente, debe hacer esto si no desea utilizar ninguna biblioteca de terceros.

También puede automatizar la contraseña / contraseña que ingresa usando pexpect .

paramiko

paramiko es una biblioteca de terceros que agrega compatibilidad con el protocolo SSH, por lo que puede funcionar como un cliente SSH.

El código de ejemplo que se conectaría al servidor, ejecutaría y capturaría los resultados del ls -l se vería así:

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

tela

También puedes lograrlo utilizando fabric .
Fabric es una herramienta de implementación que ejecuta varios comandos en servidores remotos.

A menudo se usa para ejecutar cosas en un servidor remoto, por lo que puede poner fácilmente su última versión de la aplicación web, reiniciar un servidor web y otras cosas con un solo comando. En realidad, puede ejecutar el mismo comando en varios servidores, ¡lo que es increíble!

Aunque fue creado como una herramienta de implementación y administración remota, aún puede usarlo para ejecutar comandos básicos.

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

Es como escribir cd / y ls -l en el servidor remoto, de modo que obtendrá la lista de directorios en su carpeta raíz.

A continuación, ejecute en la shell:

 fab list_files 

Se le pedirá una dirección de servidor:

 No hosts found. Please specify (single) host string for connection: irfan@raspberry.lan 

Una nota rápida : también puede asignar un nombre de usuario y un derecho de host en un comando fab :

 fab list_files -U irfan -H raspberry.lan 

O puede poner un host en la variable env.hosts en su archivo fabfile. Aquí está cómo hacerlo .


Entonces se le pedirá una contraseña SSH:

 [irfan@raspberry.lan] run: ls -l [irfan@raspberry.lan] Login password for 'irfan': 

Y luego el comando se ejecutará con éxito.

 [irfan@raspberry.lan] out: total 84 [irfan@raspberry.lan] out: drwxr-xr-x 2 root root 4096 Feb 9 05:54 bin [irfan@raspberry.lan] out: drwxr-xr-x 3 root root 4096 Dec 19 08:19 boot ... 

Ejemplo simple desde aquí :

 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 

Hace exactamente lo que quiere: se conecta a través de ssh, ejecuta el comando, devuelve la salida. No se necesita una biblioteca de terceros.

Puede usar el siguiente método con el comando ssh incorporado de 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')