Herramientas de usuario

Herramientas del sitio


informatica:programacion:python:modulos:paramiko

Paramiko

Paramiko es una implementación en Python del protocolo SSH, ofreciendo funcionalidad de cliente y servidor.

Paramiko permite que el usuario se valide tanto por contraseña como por par de llaves,

Instalación

Se puede instalar mediante pip: pip install paramiko

SSH

Conexión con credenciales

import paramiko
 
# Inicia un cliente SSH
ssh_client = paramiko.SSHClient()
 
# Establecer política por defecto para localizar la llave del host localmente
# Si no lo indicamos y queremos conectarnos mediante usuario y contraseña,
# Paramiko mostrará una excepción 'SSHException' porque el servidor al que 
# queremos conectarnos no dispone de la clave pública del equipo local
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
 
# Conectarse
ssh_client.connect('123.456.78.90', 22, 'user', 'secretpassword')
 
# Ejecutar un comando de forma remota capturando entrada, salida y error estándar
entrada, salida, error = ssh_client.exec_command('ls -la')
 
# Mostrar la salida estándar en pantalla (en este caso es una lista de líneas)
print(salida.readlines())
 
# Cerrar la conexión
ssh_client.close()

Si no queremos que la contraseña quede almacenada en el código, se puede pedir por pantalla para introducirla por teclado:

from getpass import getpass
import paramiko
 
clave = getpass('Clave: ')
HOST = '123.456.78.90'
PUERTO = 372
USUARIO = 'juanperez'
 
datos = dict(hostname=HOST, port=PUERTO, username=USUARIO, password=CLAVE)
ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(**datos)
entrada, salida, error = ssh_client.exec_command('ls -la')
print(salida.read())
ssh_client.close()

Conexión mediante clave pública

Para conectarse evitando la utilización de una contraseña, se tiene que haber creado una llave pública que el usuario debió enviar al servidor.

import paramiko
 
HOST = '123.456.78.90'
PUERTO = 372
USUARIO = 'juanperez'
 
datos = dict(hostname=HOST, port=PUERTO, username=USUARIO)
ssh_client = paramiko.SSHClient()
 
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(**datos)
entrada, salida, error = ssh_client.exec_command('ls -la')
print(salida.read())
ssh_client.close()

Si queremos utilizar otra clave, la tenemos que especificar a la hora de hacer la conexión:

ssh_client.connect(hostname = "123.456.78.90", username = "usuario", key_filename="ruta/clave_privada", port = 22)

Conexión SSH anidada

Si queremos conectarnos a un servidor SSH y después, desde ese servidor, conectarnos a otro.

import paramiko
import sys
import subprocess
 
jumphost = "192.168.1.10"
server = "192.168.1.11"
 
# we instantiate a new object referencing paramiko's SSHClient class
vm = paramiko.SSHClient()
vm.set_missing_host_key_policy(paramiko.AutoAddPolicy())
vm.connect(jumphost, username='root', password='a')
 
#
vmtransport = vm.get_transport()
server_addr = (server, 22) #edited#
jump_host = (jumphost, 22) #edited#
 
jhost = paramiko.SSHClient()
jhost.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#jhost.load_host_keys('/home/osmanl/.ssh/known_hosts') #disabled#
jhost.connect(server, username='root', password='a', sock=vmchannel)
 
stdin, stdout, stderr = jhost.exec_command("cat /home/server")
#
print(stdout.read()) #edited#
#
jhost.close()
vm.close()

Transferencia de ficheros

import paramiko
 
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname = "", username = "", password = "", port = 22)
 
sftp_client = ssh.opensftp()
 
# Listamos las operaciones que podemos realizar sobre el nuevo objeto
print(dir(sftp_client))
 
# Descargamos un fichero desde servidor al equipo local
sftp_client.get("/ruta/al/archivo/remoto.ext", "/ruta/destino/archivo/local.txt")
 
# Subimos un fichero al servidor SSH
sftp_client.put("/ruta/destino/archivo/local.txt", "/ruta/al/archivo/remoto.ext")
 
sftp_client.close()
ssh.close()
informatica/programacion/python/modulos/paramiko.txt · Última modificación: por tempwin