Paramiko

Existen paquetes que facilitan las conexiones de red, paramiko es uno que, entre otras cosas, nos permite realizar conexiones ssh a un servidor, mostrando en tiempo real el resultado de los comandos que se ejecuten en el mismo. Tanto el paquete como la documentación se puede encontrar en su página web https://www.paramiko.org, si bien la instalación en nuestro entorno se realiza ejecutando el comando:

pip install paramiko

Como con el resto de paquetes externos, para usar los métodos del mismo, primero se debe importar con el comando.

import paramiko

En el siguiente ejemplo se realizará una conexión a un servidor Linux por ssh y se podrá ver en tiempo real el resultado de ejecutar el comando uname -a que muestra la versión del sistema operativo.

Para realizar la conexión ssh se necesitará el nombre del host, el usuario con acceso a ese servidor y la contraseña. Posteriormente se podrá reemplazar el primer argumento del método exec_command por el comando Linux que se necesite ejecutar en el servidor. Por ejemplo, si fuera una distribución basada en Redhat se podría escribir yum -y update para actualizarla, yum -y install vim para instalar el editor Vim, cat /etc/fstab, etc.

Para teclear la contraseña, es interesante importar getpass que posibilitará hacer un input de la misma, pero sin salida por la consola para que nadie vea lo escrito. Para conseguir esto se usa getpass.getpass().

import getpass

import paramiko

import sys

class Ssh:

    def __init__(self):

        self.HOST = ''

        self.USERNAME = ''

        self.PASSWORD = ''

        self.CLIENT = None

    def conecta(self):

        try:

            self.HOST = input('Nombre o ip del host: ')

            self.USERNAME = input('Usuario: ')

            self.PASSWORD = getpass.getpass()

        except:

            print('Error al introducir alguno de los datos')

            sys.exit(1)

        try:

            # Conectamos por ssh

            self.CLIENT = paramiko.SSHClient()

            self.CLIENT.set_missing_host_key_policy(paramiko.AutoAddPolicy())

            self.CLIENT.load_system_host_keys()

            self.CLIENT.connect( hostname = self.HOST , username = self.USERNAME , password = self.PASSWORD )

        except:

            print('Error en la conexión')

            sys.exit(1)

        # Invocamos el shell para ejecutar comandos remotos

        try:

            shell = self.CLIENT.invoke_shell()

            try:

                # Ejecutamos el comando remoto

                stdin, stdout, stderr = self.CLIENT.exec_command( 'uname -a' , bufsize = -1 , timeout = None , get_pty = True , environment = None)

                # Mostramos la salida estandar línea por línea

                for line in iter(stdout.readline, ""):

                    print(line, end="")

            except:

                print('Error: al ejecutar el comando')

                sys.exit(1)

        except:

            print('Error en la conexión por ssh')

            sys.exit(1)

        # Cerramos el shell

        shell.close()

        # ------------------------------------------------------------------

        self.CLIENT.close()

if __name__ == '__main__':

    ssh = Ssh()

    ssh.conecta()

4 comentarios en «Paramiko»

  1. Hola Buenas tardes
    Tengo el siguiente error al tratar de usar el module de paramiko.
    >>> import paramiko
    Traceback (most recent call last):
    File “”, line 1, in
    File “C:\Users\myuser\AppData\Local\Programs\Python\Python39\lib\site-packages\paramiko\__init__.py”, line 22, in
    from paramiko.transport import (
    File “C:\Users\myuser\AppData\Local\Programs\Python\Python39\lib\site-packages\paramiko\transport.py”, line 93, in
    from paramiko.dsskey import DSSKey
    File “C:\Users\myuser\AppData\Local\Programs\Python\Python39\lib\site-packages\paramiko\dsskey.py”, line 37, in
    from paramiko.pkey import PKey
    File “C:\Users\myuser\AppData\Local\Programs\Python\Python39\lib\site-packages\paramiko\pkey.py”, line 32, in
    import bcrypt
    File “C:\Users\myuser\AppData\Local\Programs\Python\Python39\lib\site-packages\bcrypt\__init__.py”, line 13, in
    from ._bcrypt import (
    ImportError: DLL load failed while importing _bcrypt: No se encontró el proceso especificado.
    >>>

    PS C:\windows\system32> python –version
    Python 3.9.0

    paramiko 3.3.1
    cryptography 41.0.7

    Me ayudan por favor?
    Gracias.!

    1. Hola Carlos.

      He visto este comentario al respecto y parece que es un problema con la versión de un paquete del que depende paramiko.
      Prueba a instalar una versión inferior de bcrypt a ver si funciona.
      pip install --force-reinstall bcript==4.0.0

      Saludos
      Manuel

Deja una respuesta

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