¿Cómo puedo simplemente SSH a un servidor remoto desde un script de Python (3.0) local, proporcionar un nombre de usuario / contraseña, ejecutar un comando e imprimir la salida en la consola de Python?
Prefiero no usar ninguna biblioteca externa grande ni instalar nada en el servidor remoto.
Puede codificarlo usted mismo usando Paramiko, como se sugirió anteriormente. Alternativamente, puede buscar en Fabric, una aplicación de Python para hacer todas las cosas que preguntó:
Creo que esto se ajusta a tus necesidades. Tampoco es una biblioteca grande y no requiere instalación de servidor, aunque tiene dependencias en paramiko y pycrypt que requieren instalación en el cliente.
La aplicación solía estar aquí . Ahora se puede encontrar aquí .
* The official, canonical repository is git.fabfile.org * The official Github mirror is GitHub/bitprophet/fabric
Hay varios artículos buenos al respecto, aunque debe tener cuidado porque ha cambiado en los últimos seis meses:
Implementar Django con Fabric
Herramientas del hacker moderno de Python: Virtualenv, Fabric y Pip
Implementación simple y fácil con Fabric y Virtualenv
Más tarde: Fabric ya no requiere paramiko para instalar:
$ 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...
Sin embargo, esto es principalmente cosmético: ssh es una bifurcación de paramiko, el responsable de ambas bibliotecas es el mismo (Jeff Forcier, también autor de Fabric), y el responsable de mantenimiento tiene planes de reunir paramiko y ssh con el nombre de paramiko . (Esta corrección a través de pbanka ).
fuente
Si desea evitar módulos adicionales, puede utilizar el módulo de subproceso para ejecutar
y capturar la salida.
Prueba algo como:
process = subprocess.Popen("ssh example.com ls", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) output,stderr = process.communicate() status = process.poll() print output
Para tratar con nombres de usuario y contraseñas, puede usar subprocess para interactuar con el proceso ssh, o puede instalar una clave pública en el servidor para evitar la solicitud de contraseña.
fuente
ssh
subprocesar a través de una tubería. Consulte ¿Por qué no usar simplemente una tubería (popen ())? . Puede que sea necesariopty
,pexpect
módulos para solucionar él.He escrito enlaces de Python para libssh2 . Libssh2 es una biblioteca del lado del cliente que implementa el protocolo 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)
fuente
Su definición de "más simple" es importante aquí: código simple significa usar un módulo (aunque "biblioteca externa grande" es una exageración).
Creo que el módulo más actualizado (desarrollado activamente) es paramiko . Viene con secuencias de comandos de demostración en la descarga y tiene documentación API en línea detallada. También puede probar PxSSH , que se encuentra en pexpect . Hay una pequeña muestra junto con la documentación en el primer enlace.
De nuevo, con respecto a la simplicidad, tenga en cuenta que una buena detección de errores siempre hará que su código parezca más complejo, pero debería poder reutilizar una gran cantidad de código de los scripts de muestra y luego olvidarse de él.
fuente
Como hughdbrown, me gusta Fabric. Tenga en cuenta que si bien implementa su propia secuencia de comandos declarativa (para realizar implementaciones y demás), también se puede importar como un módulo de Python y utilizar en sus programas sin tener que escribir una secuencia de comandos de Fabric.
Fabric tiene un nuevo responsable y está en proceso de reescritura; eso significa que la mayoría de los tutoriales que encontrará (actualmente) en la web no funcionarán con la versión actual. Además, Google todavía muestra la página anterior de Fabric como primer resultado.
Para obtener documentación actualizada, puede consultar: http://docs.fabfile.org
fuente
Encontré que paramiko es de un nivel demasiado bajo y que Fabric no es especialmente adecuado para ser utilizado como biblioteca, así que armé mi propia biblioteca llamada spur que usa paramiko para implementar una interfaz un poco más agradable:
import spur shell = spur.SshShell(hostname="localhost", username="bob", password="password1") result = shell.run(["echo", "-n", "hello"]) print result.output # prints hello
También puede optar por imprimir la salida del programa mientras se ejecuta, lo cual es útil si desea ver la salida de los comandos de larga ejecución antes de que salga:
result = shell.run(["echo", "-n", "hello"], stdout=sys.stdout)
fuente
Para beneficio de aquellos que llegan aquí buscando en Google una muestra de python ssh. La pregunta y la respuesta originales son casi una descodificación antiguas ahora. Parece que paramiko ha ganado un poco de funcionalidades (Ok. Lo admitiré, adivinando aquí, soy nuevo en Python) y puedes crear un cliente ssh directamente con 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()
Este código fue adaptado de la demostración de https://github.com/paramiko/paramiko Funciona para mí.
fuente
Esto funcionó para mi
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
fuente
please refer to paramiko.org, its very useful while doing ssh using python.
import paramiko import time ssh = paramiko.SSHClient() #SSHClient() is the paramiko object</n> #Below lines adds the server key automatically to know_hosts file.use anyone one of the below ssh.load_system_host_keys() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: #Here we are actually connecting to the server. 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') #Here we are reading the lines from output. 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) as e: print(e)
fuente
Eche un vistazo a spurplus , un envoltorio sobre spur y paramiko que desarrollamos para administrar máquinas remotas y realizar operaciones de archivos.
Spurplus proporciona una
check_output()
función lista para usar :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)
fuente