Използвайте SSH пренасочване на портове.
Промяна на кода от Вложен 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 „Неизвестен сървър“
.