使用 Paramiko 设置 SSH 隧道以访问 PostgreSQL
Posted
技术标签:
【中文标题】使用 Paramiko 设置 SSH 隧道以访问 PostgreSQL【英文标题】:Setup SSH tunnel with Paramiko to access PostgreSQL 【发布时间】:2021-01-25 04:22:34 【问题描述】:我目前使用 Paramiko 访问 SFTP 服务器并连接到同一服务器上的 PostgreSQL。我发现了很多使用sshtunnel
登录PostgreSQL 的例子。但我不知道如何用纯 Paramiko 做到这一点。
目前我的代码如下所示:
# 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))
感谢您的任何建议!
【问题讨论】:
【参考方案1】:使用 SSH 端口转发。
修改Nested SSH using Python Paramiko的代码用于数据库隧道,你会得到这样的代码:
# 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_host
应设置为 localhost
。
尽管注意sshtunnel
只是 Paramiko 的包装。所以一般来说,你可以用它来简化代码,除非你有一些限制阻止你安装额外的包。
例如:Connecting to PostgreSQL database through SSH tunneling in Python
基于关于 MongoDB 的相同问题:Connect and query Mongo database over SSH with private key in Python。
强制性警告:不要使用AutoAddPolicy
- 这样做会失去对MITM attacks 的保护。如需正确解决方案,请参阅Paramiko "Unknown Server"。
【讨论】:
以上是关于使用 Paramiko 设置 SSH 隧道以访问 PostgreSQL的主要内容,如果未能解决你的问题,请参考以下文章
使用 Python Paramiko 通过双 SSH 隧道连接到数据库
sshtunnel:我可以使用 CLI、DBeaver 或 Paramiko 访问 ssh 网关,但不能使用 sshtunnel