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()
este script parece muy simple y practico.
gracias por compartirlo.
De nada, gracias a ti por leer el blog y por los comentarios.
Saludos
Manuel
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.!
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