Usa il port forwarding SSH.
Modifica del codice da SSH annidato utilizzando Python Paramiko per il tunneling del database, ottieni un codice come questo:
# 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))
Se il database PostgreSQL viene eseguito sul server SSH stesso, in genere sarà in ascolto solo sull'interfaccia di loopback. In tal caso db_host
dovrebbe essere impostato su localhost
.
Tieni però presente che sshtunnel
è solo un involucro attorno a Paramiko. Quindi, in generale, puoi usarlo per semplificare il codice, a meno che tu non abbia alcune restrizioni che ti impediscono di installare pacchetti aggiuntivi.
Ad esempio:Connessione al database PostgreSQL tramite tunneling SSH in Python
Sulla base della stessa domanda su MongoDB:
Connetti e interroga il database Mongo su SSH con chiave privata in Python
.
Avviso obbligatorio:non utilizzare AutoAddPolicy
- Stai perdendo la protezione contro attacchi MITM
facendo così. Per una soluzione corretta, vedere Paramiko "Unknown Server"
.