В моем сценарии 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)
, соединение успешно