通过SSH隧道连接到DB时,PyGreSQL/pg挂起

2024-09-28 21:35:24 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的Python脚本中,我希望能够通过SSH隧道连接到Postgres DB

我正在使用sshtunnel包创建一个隧道,并使用PyGreSQL连接到数据库。 当我尝试建立数据库连接时,pg.connect调用挂起。我一点错误都没有。当我使用psql通过sshtunnel创建的隧道连接到数据库时,连接成功

当我在shell中预先使用ssh创建隧道时,pg.connect调用成功地连接到数据库

因此,总结一下:

  • 在Python/sshtunnel中创建的隧道->;pg.connect呼叫挂起
  • 在Python/sshtunnel中创建的隧道->;psql工作得很好
  • 使用ssh创建的隧道->;pg.connect呼叫成功

这似乎是PyGreSQL的一个问题,因为psql可以通过sshtunnel使用隧道访问DB。然而,sshtunnel的tunnel包可能有一些不同之处,我没有看到

这是我用来使用SSH创建隧道的命令: ssh -g -L <local_bind_port>:localhost:<remote_bind_port> -f -N root@myip

下面是我使用SSH隧道和pg.connect在Python中连接DB的代码

from sshtunnel import SSHTunnelForwarder
dbasename = 'db'
username = 'admin'
password = 'admin'
portnum = 5432
tunnel = SSHTunnelForwarder(
            <ip_address>,
            ssh_username="admin",
            ssh_password="admin",
            remote_bind_address=('127.0.0.1', portnum)
        )
tunnel.start()
# The line below hangs
db = pg.connect(host=tunnel.local_bind_host, port=tunnel.local_bind_port, dbname=dbasename, user=username, passwd=password)

你知道是什么导致了这个问题吗?是否有可能帮助识别问题的日志等

谢谢

编辑:

事实证明,如果我在一个python shell中使用python/SSHTunnel打开一个隧道,但在第二个python shell中使用pg.connect连接到该隧道,它将成功连接。 因此,如果我在第一个shell中复制粘贴以下内容:

from sshtunnel import SSHTunnelForwarder
dbasename = 'db'
username = 'admin'
password = 'admin'
portnum = 5432
tunnel = SSHTunnelForwarder(
            <ip_address>,
            ssh_username="admin",
            ssh_password="admin",
            remote_bind_address=('127.0.0.1', portnum)
        )
tunnel.start()

然后打开另一个外壳并从第一个外壳连接到通道

import pg
# This works for some reason
db = pg.connect(host='127.0.0.1', port=<local hind port from the 1st shell>, dbname=dbasename, user=username, passwd=password)

连接成功


Tags: 数据库adminbindportlocalconnectusernamepassword