Настройте SSH-туннель с Paramiko для доступа к PostgreSQL
В настоящее время я использую Paramiko для доступа к серверу SFTP и подключения к PostgreSQL на том же сервере. Я нашел много примеров использования sshtunnelдля входа в PostgreSQL. Но я не знаю, как это сделать с чистым Парамико.
В настоящее время мой код выглядит примерно так:
# establish SSH tunnel
self.ssh = paramiko.SSHClient()
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
self.ssh.connect(hostname=host, username=user, password=password)
# setup SFTP server
self.sftp = self.ssh.open_sftp()
# connect to datebase
self.engine = create_engine('postgres+psycopg2://{}:{}@{}:{}/{}'.format(user, password, host, port, db))
Спасибо за любые предложения!
Ответы
Используйте переадресацию портов SSH.
Изменив код из Nested SSH с использованием Python Paramiko для туннелирования базы данных, вы получите такой код:
# establish SSH tunnel
self.ssh = paramiko.SSHClient()
# ...
self.ssh.connect(hostname=ssh_host, username=ssh_user, password=ssh_password)
transport = ssh_client.get_transport()
dest_addr = (db_host, db_port)
local_unique_port = 4000 # any unused local port
local_host = 'localhost'
local_addr = (local_host, local_unique_port)
vmchannel = vmtransport.open_channel("direct-tcpip", dest_addr, local_addr)
self.engine = create_engine(
'postgres+psycopg2://{}:{}@{}:{}/{}'.format(
db_user, db_password, local_host, local_unique_port, db))
Если база данных PostgreSQL работает на самом сервере SSH, то обычно она будет прослушивать только интерфейс обратной связи. В этом случае db_hostследует установить значение localhost.
Хотя заметьте, что sshtunnelэто всего лишь оболочка вокруг Парамико. В общем, вы можете использовать его для упрощения кода, если только у вас нет ограничений, мешающих вам устанавливать дополнительные пакеты.
Например: подключение к базе данных PostgreSQL через SSH-туннель в Python
На основе того же вопроса о MongoDB:
подключитесь и запросите базу данных Mongo через SSH с закрытым ключом в Python .
Обязательное предупреждение: Не использовать AutoAddPolicy- при этом вы теряете защиту от атак MITM . Для правильного решения см. Paramiko «Неизвестный сервер» .