Verwenden Sie die SSH-Portweiterleitung.
Ändern des Codes von Verschachteltes SSH mit Python Paramiko für Datenbank-Tunneling erhalten Sie einen Code wie diesen:
# 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))
Wenn die PostgreSQL-Datenbank auf dem SSH-Server selbst ausgeführt wird, lauscht sie normalerweise nur auf der Loopback-Schnittstelle. In diesem Fall db_host
sollte auf localhost
gesetzt werden .
Beachten Sie jedoch, dass sshtunnel
ist nur ein Wrapper um Paramiko. Im Allgemeinen können Sie es also verwenden, um den Code zu vereinfachen, es sei denn, Sie haben Einschränkungen, die Sie daran hindern, zusätzliche Pakete zu installieren.
Beispiel:Verbindung zur PostgreSQL-Datenbank über SSH-Tunneling in Python
Basierend auf derselben Frage zu MongoDB:
Mongo-Datenbank verbinden und abfragen SSH mit privatem Schlüssel in Python
.
Obligatorische Warnung:Verwenden Sie AutoAddPolicy
nicht - Sie verlieren den Schutz vor MITM-Angriffen
dadurch. Eine korrekte Lösung finden Sie unter Paramiko "Unknown Server"
.