Я пытаюсь подключиться к postgresql через ssh-туннель с python3 как:
import psycopg2
from sshtunnel import SSHTunnelForwarder
class Database(object):
def connect_to_database(self):
remote_server = '50.100.200.240'
private_server = 'test.amazonaws.com'
with SSHTunnelForwarder((remote_server, 22),
ssh_username='user',
ssh_pkey='/key.pem',
remote_bind_address=(private_server,
5432)) as server:
server.start()
client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
k = paramiko.RSAKey.from_private_key_file("/key.pem")
client.connect(remote_server, 22, pkey=k, username='user')
print('server connected via ssh')
conn = psycopg2.connect(host=private_server,
user='user',
password='pass',
database='test',
port=5432)
curs = conn.cursor()
curs.execute("SELECT version();")
print(curs.fetchone())
print('database connected!')
Я думаю, что ssh работает нормально, но я получаю следующую ошибку:
psycopg2.OperationalError: не удалось подключиться к серверу: время ожидания операции истекло. Сервер работает на хосте «host-url» (x.x.x.xxx) и принимает соединения TCP/IP через порт 5432?
Я также пробовал следующее предложение, но не повезло. https://www.nkallfa.com/2017/09/18/connecting-to-a-remote-postgresql-database-with-python/
x.x.x.x
в ситуации, когда вам нужно использовать как минимум три разных IP-адреса/имени хоста, не поможет нам сказать вам, что в этом случае вы сделали ошибку! Вы должны сообщить нам, какие адреса вы использовали в разных местах и почему. Но ваш код определенно неверен, даже если вы использовали правильный IP-адрес (что вы, вероятно, в любом случае не так), поскольку вы не подключаетесь к номеру переадресованного порта. См., в частности, этот пример: sshtunnel.readthedocs.io/en/latest/#example-2 и ответ на повторяющийся вопрос stackoverflow.com/a/4039091/850848 - person Martin Prikryl   schedule 05.04.2019SSHClient
- это бессмысленно - вам нужен толькоSSHTunnelForwarder
3)psycopg2.connect
должен подключаться к хостуlocalhost
и перенаправленному портуserver.local_bind_port
. Снова см. ссылки в моем предыдущем комментарии. - person Martin Prikryl   schedule 05.04.2019local_bind_address
, он выбирается автоматически. Вы можете использоватьserver.local_bind_port
для получения выбранного порта. На самом деле это лучше, так как позволяет избежать конфликтов с другим программным обеспечением, которое может использовать тот же локальный порт, который в противном случае был бы жестко запрограммирован наlocal_bind_address
. - person Martin Prikryl   schedule 05.04.2019