PyGreSQL / pg зависает при подключении к БД через туннель S SH - PullRequest
0 голосов
/ 04 апреля 2020

В моем сценарии Python я хочу иметь возможность подключаться к Postgres БД через туннель S SH.

Я использую пакет sshtunnel для создания туннеля и использую PyGre SQL для подключения к БД. Когда я пытаюсь установить sh соединение с базой данных, вызов pg.connect просто зависает. Я не получаю никаких ошибок вообще. Когда я использую psql для подключения к БД с использованием туннеля, созданного sshtunnel, соединение успешно.

Когда я заранее создаю туннель, используя s sh в оболочке, вызов pg.connect успешно соединяется с база данных.

Итак, подведем итог:

  • Туннель, созданный в Python / sshtunnel -> вызов pg.connect висит
  • Туннель, созданный в Python / sshtunnel -> psql работает просто отлично
  • Туннель, созданный с помощью s sh -> вызов pg.connect успешен

Это похоже на проблему с PyGre SQL, так как psql может получить доступ к БД с помощью туннеля по sshtunnel просто отлично. Однако в туннеле может быть что-то отличное от пакета sshtunnel, которого я не вижу.

Это команда, которую я использую для создания туннеля с использованием S SH: ssh -g -L <local_bind_port>:localhost:<remote_bind_port> -f -N root@myip

Ниже приведен мой код для подключения к БД в Python с использованием S SH Tunnel и pg.connect

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)

Есть идеи о том, что может вызвать эту проблему? Существуют ли какие-либо журналы et c I, которые могут помочь выявить проблему?

Спасибо.

РЕДАКТИРОВАТЬ:

Получается, что если я открою туннель с помощью python / SSHTunnel в одной оболочке python, но используйте pg.connect для подключения к этому туннелю во второй оболочке python, которую он успешно соединяет. Поэтому, если я скопирую, вставьте следующее в 1-ю оболочку:

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()

, затем откройте другую оболочку и подключитесь к туннелю из 1-й оболочки

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)

, соединение успешно

...