Amazon RDS( "D")でホストされているリモートMySQLデータベースがあります。セキュリティ上の理由から、リモートサーバー(「C」)を介してのみアクセスできます。 Cは、ジャンプホスト "B"を介してssh経由でアクセスできます。私は、リモートSQLホストにアクセスするために二重SSHトンネルが必要です。ジャンプホストとリモートデータベースを使用したSSHトンネル転送
[A: local host] -> [B: jump host] -> [C: target host] => [D: RDS MySQL host]
paramikoおよび/またはsshtunnelを使用してDからPythonにアクセスしたいと思います。私は見つけることができるすべての情報が含まれます。
- 単一SSHトンネルとリモートSQLホスト(例A - > C => D、無ジャンプホスト。)
- SQLホスト(例:A - > B - > C、DはCでホストされています)へのダブルsshトンネルです。
- Connecting to remote Postgresql database over ssh tunnel using python
- Paramiko: Port Forwarding Around A NAT Router
- Nested SSH session with Paramiko
私の現在のコード:
import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
proxy = paramiko.ProxyCommand("ssh -A [email protected]_host -W C_host:12345")
ssh.connect("C_host", username="C_username", sock=proxy)
stdin, stdout, stderr = ssh.exec_command("mysql -u D_username -p D_password -h D_host_rds")
print("STDOUT:\n{}\n\nSTDERR:\n{}\n".format(stdout.read(), stderr.read()))
# successfully prints out MySQL welcome screen
私はこのような何かを探しています(sshtunnel docs例2から変更):
import paramiko
from sshtunnel import SSHTunnelForwarder
with SSHTunnelForwarder(
intermediate = {
("B_host", 22),
ssh_username = "B_username",
ssh_password = "B_password")},
remote = {
("C_host", 12345),
ssh_username = "C_username",
ssh_password = "C_password")},
remote_bind_address=("D_host_rds", 3306),
local_bind_address=("0.0.0.0", 3307)) as server:
conn = MySQLdb.connect(
user = "D_username",
passwd = "D_password",
db = "my_database",
host = "127.0.0.1",
port = 3307)
TL; DR:どのように前方Iを行いますPythonで2つのsshジャンプを通るポート?
[回答](https://stackoverflow.com/a/44739471/6412017)を見つけました。 – blep