Użyj przekierowania portów SSH.
Modyfikacja kodu z Zagnieżdżonego SSH przy użyciu Pythona Paramiko do tunelowania bazy danych otrzymujesz kod taki:
# 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))
Jeśli baza danych PostgreSQL działa na samym serwerze SSH, zwykle będzie nasłuchiwać tylko na interfejsie pętli zwrotnej. W takim przypadku db_host
powinien być ustawiony na localhost
.
Pamiętaj jednak, że sshtunnel
to tylko opakowanie wokół Paramiko. Ogólnie rzecz biorąc, możesz go użyć do uproszczenia kodu, chyba że masz pewne ograniczenia uniemożliwiające instalowanie dodatkowych pakietów.
Na przykład:Łączenie z bazą danych PostgreSQL przez tunelowanie SSH w Pythonie
Na podstawie tego samego pytania dotyczącego MongoDB:
Połącz i przeszukuj bazę danych Mongo przez SSH z kluczem prywatnym w Pythonie
.
Obowiązkowe ostrzeżenie:nie używaj AutoAddPolicy
- Tracisz ochronę przed atakami MITM
w ten sposób. Aby uzyskać prawidłowe rozwiązanie, zobacz Paramiko „Nieznany serwer”
.