¡Esta es una revisión vieja del documento!
Tabla de Contenidos
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="clave", 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()
