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)
No lo he probado, pero este módulo pysftp podría ayudar, que a su vez usa paramiko. Creo que todo está del lado del cliente.
El comando interesante es probablemente .execute()
que ejecuta un comando arbitrario en la máquina remota. (El módulo también incluye .get()
y .put
métodos que aluden más a su carácter FTP).
ACTUALIZAR:
He vuelto a escribir la respuesta después de que la publicación del blog a la que originalmente me vinculé ya no está disponible. Algunos de los comentarios que se refieren a la versión anterior de esta respuesta ahora se verán raros.
Puede codificarlo usted mismo usando Paramiko, como se sugirió anteriormente. Alternativamente, puede consultar Fabric, una aplicación de Python para hacer todas las cosas sobre las que preguntó:
Fabric es una biblioteca de Python y una herramienta de línea de comandos diseñada para simplificar la implementación de aplicaciones o la realización de tareas de administración del sistema a través del protocolo SSH. Proporciona herramientas para ejecutar comandos de shell arbitrarios (ya sea como un usuario de inicio de sesión normal o mediante sudo), cargar y descargar archivos, etc.
Creo que esto se ajusta a tus necesidades. Tampoco es una biblioteca grande y no requiere instalación del 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 buenos artículos al respecto, aunque debes tener cuidado porque ha cambiado en los últimos seis meses:
Implementando Django con Fabric
Herramientas del Pitón Hacker Moderno: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 mantenedor de ambas bibliotecas es el mismo (Jeff Forcier, también autor de Fabric), y el mantenedor tiene planes de reunir paramiko y ssh bajo el nombre de paramiko. (Esta corrección a través de pbanka.)
Si desea evitar módulos adicionales, puede usar el módulo de subproceso para ejecutar
ssh [host] [command]
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 manejar nombres de usuario y contraseñas, puede usar el subproceso para interactuar con el proceso ssh, o puede instalar una clave pública en el servidor para evitar la solicitud de contraseña.