PostgreSQL'e erişmek için Paramiko ile SSH tünelini kurun

Oct 10 2020

Şu anda bir SFTP sunucusuna erişmek ve aynı sunucu üzerindeki PostgreSQL'e bağlanmak için Paramiko kullanıyorum. sshtunnelPostgreSQL'de oturum açmak için kullanılan birçok örnek buldum . Ama bunu saf Paramiko ile nasıl yapacağımı bilmiyorum.

Şu anda kodum şuna benzer:

# 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))

Herhangi bir öneriniz için teşekkürler!

Yanıtlar

1 MartinPrikryl Oct 12 2020 at 17:06

SSH bağlantı noktası yönlendirmeyi kullanın.

Veritabanı tünellemesi için Python Paramiko kullanarak İç içe SSH'den kodu değiştirmek, aşağıdaki gibi bir kod alırsınız:

# 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 veritabanı SSH sunucusunun kendisinde çalışıyorsa, genellikle yalnızca geri döngü arayüzünü dinler. Bu durumda db_hostolarak ayarlanmalıdır localhost.


Yine de sshtunnel, bunun Paramiko'nun etrafındaki bir paket olduğuna dikkat edin . Bu nedenle, ek paketler kurmanızı engelleyen bazı kısıtlamalarınız yoksa, genel olarak kodu basitleştirmek için kullanabilirsiniz.

Örneğin: Python'da SSH tünelleme yoluyla PostgreSQL veritabanına bağlanma


MongoDB ile ilgili aynı soruya dayanarak:
Python'da özel anahtarla SSH üzerinden Mongo veritabanına bağlanın ve sorgulayın
.


Zorunlu uyarı: Kullanmayın AutoAddPolicy- Bunu yaparak MITM saldırılarına karşı korumayı kaybediyorsunuz . Doğru çözüm için bkz. Paramiko "Bilinmeyen Sunucu" .