SSHポートフォワーディングを使用します。
PythonParamikoを使用してネストされたSSH からコードを変更する データベーストンネリングの場合、次のようなコードを取得します。
# 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
Paramikoの単なるラッパーです。したがって、一般的に、追加のパッケージをインストールすることを妨げるいくつかの制限がない限り、コードを単純化するためにそれを使用できます。
例:PythonのSSHトンネリングを介したPostgreSQLデータベースへの接続
MongoDBに関する同じ質問に基づく:
Mongoデータベースに接続してクエリを実行するPythonの秘密鍵を使用したSSH
。
必須の警告:AutoAddPolicy
は使用しないでください -MITM攻撃
に対する保護が失われています。 そうすることによって。正しい解決策については、 Paramiko "UnknownServer"
を参照してください。 。