通过SSH隧道连接到数据库时,PyGreSQL / pg挂起

时间:2020-04-04 19:17:08

标签: python ssh ssh-tunnel pygresql

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

我正在使用sshtunnel包创建隧道,并使用PyGreSQL连接到数据库。 当我尝试建立数据库连接时,pg.connect调用只是挂起。我完全没有任何错误。当我使用sshtunnel创建的隧道使用psql连接到数据库时,连接成功。

当我在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外壳中使用python / SSHTunnel打开隧道,但在第二个python外壳中使用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)

连接成功

0 个答案:

没有答案