Configure el túnel SSH con Paramiko para acceder a PostgreSQL
Actualmente uso Paramiko para acceder a un servidor SFTP y conectarme a PostgreSQL en el mismo servidor. Encontré muchos ejemplos que usan sshtunnelpara iniciar sesión en PostgreSQL. Pero no sé cómo hacerlo con Paramiko puro.
Actualmente mi código se parece a:
# establish SSH tunnel
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(hostname=host, username=user, password=password)
# setup SFTP server
self.sftp = self.ssh.open_sftp()
# connect to datebase
self.engine = create_engine('postgres+psycopg2://{}:{}@{}:{}/{}'.format(user, password, host, port, db))
¡Gracias por cualquier sugerencia!
Respuestas
Utilice el reenvío de puertos SSH.
Modificando el código de SSH anidado usando Python Paramiko para la tunelización de la base de datos, obtiene un código como este:
# establish SSH tunnel
self.ssh = paramiko.SSHClient()
# ...
self.ssh.connect(hostname=ssh_host, username=ssh_user, password=ssh_password)
transport = ssh_client.get_transport()
dest_addr = (db_host, db_port)
local_unique_port = 4000 # any unused local port
local_host = 'localhost'
local_addr = (local_host, local_unique_port)
vmchannel = vmtransport.open_channel("direct-tcpip", dest_addr, local_addr)
self.engine = create_engine(
'postgres+psycopg2://{}:{}@{}:{}/{}'.format(
db_user, db_password, local_host, local_unique_port, db))
Si la base de datos PostgreSQL se ejecuta en el servidor SSH, normalmente escuchará solo en la interfaz de bucle invertido. En ese caso, db_hostdebería establecerse en localhost.
Aunque tenga en cuenta que sshtunneles solo una envoltura de Paramiko. Entonces, en general, puede usarlo para simplificar el código, a menos que tenga algunas restricciones que le impidan instalar paquetes adicionales.
Por ejemplo: conectarse a la base de datos PostgreSQL a través de un túnel SSH en Python
Basado en la misma pregunta sobre MongoDB:
conecte y consulte la base de datos Mongo a través de SSH con clave privada en Python .
Advertencia obligatoria: No usar: al hacerlo AutoAddPolicy, está perdiendo la protección contra los ataques MITM . Para una solución correcta, consulte Paramiko "Servidor desconocido" .