Conexión sftp con paramiko

Se puede descargar un fichero de un servidor Linux usando el paquete paramiko y el protocolo SSH File Transfer Protocol comúnmente conocido como sftp.

Para ello lo primero que se ha de hacer es importar la librería paramiko y si aún no estuviera instalada en el sistema se hace uso de pip para instalarla.

# pip install paramiko

Tras la importación de la librería lo siguiente es conectar con el servidor por ssh para poder posteriormente usar sftp y descargar el archivo.

Pero vayamos por partes.

Primero importamos paramiko y los paquetes que vayamos a usar que en este caso será el paquete getpass el cual nos facilitará que podamos introducir un password por consola sin que nadie vea lo que estamos escribiendo, cosa que se hace en el método conecta de la clase Ssh.

La clase Ssh contiene los métodos __init__ que define los atributos de nombre o ip del host, nombre de usuario y contraseña con valores por defecto y el método conecta que hace la conexión al servidor y descarga el archivo.

Dentro del método conecta creamos un handler de paramiko.SSHClient() para hacer la conexión el cual asignamos a la variable cliente y posteriormente asignamos a la variable sftp un handler de cliente.open_sftp() para gestionar la conexión sftp. Con el método chdir cambiamos el directorio del servidor y con get descargamos el archivo.

Para el ejemplo descargaremos el archivo hosts que se encuentra en la carpeta /etc/ y guardándolo en nuestro equipo como mifichero_hosts.

class Ssh:
    def __init__(self):
        self.HOST = '192.168.0.100'
        self.USERNAME = 'root'
        self.PASSWORD = ''

    def conecta(self):
        try:
            self.PASSWORD = getpass.getpass()
        except:
            print('Error al introducir el password')

        # Conectamos por ssh
        cliente = paramiko.SSHClient()
        cliente.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        cliente.load_system_host_keys()
        cliente.connect( hostname = self.HOST , username = self.USERNAME , password = self.PASSWORD )

        sftp = cliente.open_sftp()
        sftp.chdir('/etc/')
        sftp.get('hosts','mifichero_hosts')
        sftp.close()

        cliente.close()

Incluimos el siguiente código que detecta que estamos ejecutando el script manualmente, instancia la clase y realiza la conexión.

if __name__ == '__main__':
    ssh = Ssh()
    ssh.conecta()

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *