0

在我的 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 使用隧道访问数据库就好了。但是,我没有看到的 sshtunnel 包中的隧道可能有所不同。

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

以下是我使用 SSH 隧道和 pg.connect 在 Python 中连接到数据库的代码

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)

连接成功

4

0 回答 0