Use o encaminhamento de porta SSH.
Modificando o código de SSH aninhado usando Python Paramiko para encapsulamento de banco de dados, você obtém um código como este:
# 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))
Se o banco de dados PostgreSQL for executado no próprio servidor SSH, ele normalmente escutará apenas na interface de loopback. Nesse caso
db_host
deve ser definido como localhost
. Embora observe que
sshtunnel
é apenas um invólucro em torno de Paramiko. Portanto, em geral, você pode usá-lo para simplificar o código, a menos que tenha algumas restrições que o impeçam de instalar pacotes adicionais. Por exemplo:Conectando-se ao banco de dados PostgreSQL por meio de encapsulamento SSH em Python
Com base na mesma pergunta sobre o MongoDB:
Conecte e consulte o banco de dados Mongo SSH com chave privada em Python .
Aviso obrigatório:não use
AutoAddPolicy
- Você está perdendo a proteção contra ataques MITM
ao fazê-lo. Para uma solução correta, consulte Paramiko "Unknown Server"
.