Richten Sie mit Paramiko einen SSH-Tunnel ein, um auf PostgreSQL zuzugreifen
Ich verwende derzeit Paramiko, um auf einen SFTP-Server zuzugreifen und eine Verbindung zu PostgreSQL auf demselben Server herzustellen. Ich habe viele Beispiele gefunden, mit denen ich mich sshtunnelbei PostgreSQL anmelden kann. Aber ich weiß nicht, wie ich es mit reinem Paramiko machen soll.
Derzeit sieht mein Code ungefähr so aus:
# 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))
Vielen Dank für alle Vorschläge!
Antworten
Verwenden Sie die SSH-Portweiterleitung.
Wenn Sie den Code von Nested SSH mit Python Paramiko für das Tunneln von Datenbanken ändern , erhalten Sie einen Code wie den folgenden:
# 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, überwacht sie normalerweise nur die Loopback-Schnittstelle. In diesem Fall db_hostsollte auf gesetzt werden localhost.
Beachten Sie jedoch, dass dies sshtunnelnur eine Hülle um Paramiko ist. Im Allgemeinen können Sie damit den Code vereinfachen, es sei denn, Sie haben einige Einschränkungen, die Sie daran hindern, zusätzliche Pakete zu installieren.
Beispiel: Herstellen einer Verbindung zur PostgreSQL-Datenbank durch SSH-Tunneling in Python
Basierend auf derselben Frage zu MongoDB:
Verbinden und Abfragen der Mongo-Datenbank über SSH mit privatem Schlüssel in Python .
Obligatorische Warnung: Nicht verwenden AutoAddPolicy- Sie verlieren dadurch den Schutz vor MITM-Angriffen . Eine korrekte Lösung finden Sie unter Paramiko "Unbekannter Server" .