====== Paramiko ======
Paramiko es una implementación en Python del protocolo SSH, ofreciendo funcionalidad de cliente y servidor.
* [[http://www.paramiko.org/|Web oficial]]
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()