73 votos

¿Cuál es la forma más sencilla de SSH utilizando Python?

¿Cómo puedo simplemente SSH a un servidor remoto desde un script en Python (3.0) local, suministrar un login/contraseña, ejecutar un comando e imprimir la salida de la consola de Python?

Prefiero no usar cualquier gran biblioteca externa o instalar nada en el servidor remoto.

56voto

hughdbrown Puntos 15770

Puedes código usted mismo utilizando Paramiko, como se sugirió anteriormente. Alternativamente, usted puede buscar en la Tela, una aplicación python para hacer todas las cosas que le preguntó acerca de:

La tela es una biblioteca de Python y herramienta de línea de comandos diseñado para agilizar la implementación de las aplicaciones o realizar tareas de administración del sistema a través del protocolo SSH. Se ofrece herramientas para la ejecución arbitraria de shell comandos (como una normal de inicio de sesión el usuario, o mediante sudo), la carga y la descarga de archivos, y así sucesivamente.

Creo que este se adapte a sus necesidades. Además, no es una gran biblioteca, y no requiere de instalación del servidor, aunque tiene dependencias en paramiko y pycrypt que requieren de instalación en el cliente.

La aplicación utilizada para estar aquí. Puede ahora ser encontrado aquí.

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

Hay varios buenos artículos sobre él, aunque se debe tener cuidado, ya que ha cambiado en los últimos seis meses:

La implementación de Django con Tela

Herramientas de la Moderna Python Hacker: Virtualenv, Tela y Pip

Simple y Fácil Implementación con Tela y Virtualenv


Más tarde: la Tela 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...

Esto es principalmente estética, sin embargo: ssh es un fork de paramiko, el encargado de las dos bibliotecas es el mismo (Jeff Forcier, también el autor de la Tela), y el mantenedor tiene planes para reunir a paramiko y ssh bajo el nombre de paramiko. (Esta corrección a través de pbanka.)

37voto

ThomasH Puntos 6597

Yo no lo he probado, pero este pysftp módulo puede ser de ayuda, que a su vez utiliza paramiko. Creo que todo está en el cliente.

El comando interesante es probablemente .execute() que se ejecuta un comando arbitrario en la máquina remota. (El módulo también cuenta .get() y .put métodos que aluden más a su FTP de caracteres).

ACTUALIZACIÓN:

He re-escrito la respuesta después de la entrada en el blog me vinculado originalmente a ya no está disponible. Algunos de los comentarios que se refieren a la versión anterior de esta respuesta tendrá ahora un aspecto extraño.

21voto

Neil Puntos 1304

Si quiere evitar cualquier módulos adicionales, puede utilizar el módulo de subproceso para correr

ssh [host] [command]

y captura la salida.

Intentar 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 utilizar subproceso para interactuar con el ssh proceso, o usted podría instalar una clave pública en el servidor para evitar la contraseña.

14voto

Sebastian Noack Puntos 458

He escrito Python bindings para libssh2. Libssh2 es una biblioteca de cliente implementar 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)

7voto

Jefromi Puntos 127932

Su definición de "simple" es importante aquí - código simple significa el uso de un módulo (a pesar de la "gran biblioteca externa" es una exageración).

Creo que la mayoría de arriba-a-fecha (desarrollado activamente) módulo es paramiko. Viene con scripts de demostración en la descarga, y ha detallado en línea la documentación de la API. También se podría tratar de PxSSH, la cual está contenida en pexpect. Hay un corto de la muestra junto con la documentación que en el primer enlace.

De nuevo con respecto a la simplicidad, tenga en cuenta que buena detección de errores siempre va a hacer que tu código sea más complicadas, pero usted debería ser capaz de reutilizar gran parte del código de los scripts de ejemplo luego olvidarse de él.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X