Python 使用Paramiko设置SSH隧道以访问PostgreSQL

Python 使用Paramiko设置SSH隧道以访问PostgreSQL,python,postgresql,ssh,paramiko,ssh-tunnel,Python,Postgresql,Ssh,Paramiko,Ssh Tunnel,我目前使用Paramiko访问SFTP服务器并连接到同一服务器上的PostgreSQL。我发现了许多使用sshtunnel登录PostgreSQL的例子。但我不知道如何用纯帕拉米科 目前,我的代码类似于: # establish SSH tunnel self.ssh = paramiko.SSHClient() self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) self.ssh.connect(hostname=hos

我目前使用Paramiko访问SFTP服务器并连接到同一服务器上的PostgreSQL。我发现了许多使用
sshtunnel
登录PostgreSQL的例子。但我不知道如何用纯帕拉米科

目前,我的代码类似于:

# 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))

谢谢你的建议

使用SSH端口转发

修改数据库隧道的源代码时,会得到如下代码:

# 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))
如果PostgreSQL数据库在SSH服务器本身上运行,那么它通常只在环回接口上侦听。在这种情况下,
db\u host
应设置为
localhost


不过请注意,这只是帕拉米科的一个包装。因此,一般来说,您可以使用它来简化代码,除非您有一些限制阻止您安装其他软件包

例如:


基于关于MongoDB的相同问题:


强制性警告:不要使用
AutoAddPolicy
-这样做会失去保护。有关正确的解决方案,请参阅