使用 SSH 端口转发。
修改代码自使用 Python Paramiko 的嵌套 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_host
应设置为localhost
.
尽管请注意sshtunnel只是 Paramiko 的包装。所以一般来说,你可以使用它来简化代码,除非你有一些限制阻止你安装额外的包。
例如:在Python中通过SSH隧道连接到PostgreSQL数据库
基于关于 MongoDB 的相同问题:
在Python中使用私钥通过SSH连接并查询Mongo数据库.
强制性警告:请勿使用AutoAddPolicy
- 您正在失去针对中间人攻击通过这样做。正确的解决方案请参见Paramiko“未知服务器”.