使用 Python Paramiko 通过双 SSH 隧道连接到数据库

Posted

技术标签:

【中文标题】使用 Python Paramiko 通过双 SSH 隧道连接到数据库【英文标题】:Connect to database through double SSH tunnel using Python Paramiko 【发布时间】:2021-09-27 16:00:39 【问题描述】:

这是我的ssh 命令,它通过堡垒主机代理与 Postgres 数据库建立隧道 -

ssh -i C:/public/keys/my_key.pem -o "ProxyCommand ssh -W %h:%p username1@bastion_host.com" username2@ssh_host_ip -N -L 12345:postgres_host.com:5432 ssh_host_ip

我想使用sshtunnel 实用程序将其转换为 Python 脚本。但是很难弄清楚在所描述的实用程序中传递什么:

在示例 4 中通过此链接:https://github.com/pahaz/sshtunnel#example-4 或此链接:Double SSH tunnel within Python

我在 Stack Overflow 上浏览了几篇文章,但没有看到直接的方法。开发人员正在使用代理转发作为代理命令的解决方案。将上述命令直接转换为 sshtunnel 或 Paramiko 或任何其他 Python 方式都会非常有帮助。

【问题讨论】:

【参考方案1】:

基于Connecting to PostgreSQL database through SSH tunneling in Python,应该做以下事情:

with SSHTunnelForwarder(
        'bastion_host',
        ssh_username="username1", ssh_password="password1",
        remote_bind_address=('ssh_host_ip', 22)) as bastion:
        
    bastion.start()
    
    with SSHTunnelForwarder(
            ('127.0.0.1', bastion.local_bind_port),
            ssh_username="username2", ssh_pkey="C:/public/keys/my_key.pem",
            remote_bind_address=('postgres_host', 5432)) as ssh:

        ssh.start()

        engine = create_engine(
            'postgresql://<db_username>:<db_password>@127.0.0.1:' +
            str(ssh.local_bind_port) + '/database_name')

【讨论】:

以上是关于使用 Python Paramiko 通过双 SSH 隧道连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

Python paramiko 模块

如何使用 ppk 公钥通过 python Paramiko 进行 ssh 连接

使用 Paramiko 或其他 Python 库通过 SSH 跳转服务器远程登录网络设备

python(paramiko模块的简单使用)

Python模块 - Paramiko

Python模块学习 - Paramiko