Utilice el reenvío de puertos SSH.
Modificando el código desde 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 de PostgreSQL se ejecuta en el propio servidor SSH, normalmente solo escuchará en la interfaz de bucle invertido. En ese caso db_host
debe establecerse en localhost
.
Aunque tenga en cuenta que sshtunnel
es solo una envoltura alrededor 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 túneles SSH en Python
Basado en la misma pregunta sobre MongoDB:
Conéctese y consulte la base de datos de Mongo SSH con clave privada en Python
.
Advertencia obligatoria:no utilice AutoAddPolicy
- Estás perdiendo una protección contra ataques MITM
al hacerlo. Para obtener una solución correcta, consulte Paramiko "Unknown Server"
.