python - 使用 Paramiko 设置 SSH 隧道以访问 PostgreSQL
问题描述
我目前使用 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))
感谢您的任何建议!
解决方案
使用 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 的相同问题:
Connect and query Mongo database over SSH with private key in Python。
强制性警告:请勿使用-这样做AutoAddPolicy
会失去对MITM 攻击的保护。有关正确的解决方案,请参阅Paramiko "Unknown Server"。
推荐阅读
- powershell - 是否可以使用 -Append 创建 csv 导出但覆盖它?
- cloud-foundry - 限制客户可以询问的 CF-UAA 范围
- reactjs - Create React App Build 和 Docker-Compose 不传递环境变量
- android - Systrace 不生成 html 报告或收集输出,异常从 atrace 获取结果
- django - 使用 prefetch 和 to_attr 从相关模型访问 pk
- ansible - 来自 set 变量的 Ansible 渲染变量
- css - 如何设置响应图像的最大宽度(Bootstrap 4)?
- sparql - Wikidata 标签在 SPARQL 查询浏览器中解析,但不是通过 GET 请求
- c++ - 为什么结构化绑定在 struct 上不能按预期工作?
- dialogflow-es - DialogFlow 在训练短语中查找实体,但不在用户查询中查找实体