我有一个远程MySQL数据库托管在Amazon RDS(“D”)上。出于安全目的,它只能通过远程服务器(“C”)访问。 C可以通过ssh通过跳转主机“B”访问。我需要一个双重ssh隧道才能访问远程SQL主机。带跳转主机和远程数据库的SSH隧道转发
[A: local host] -> [B: jump host] -> [C: target host] => [D: RDS MySQL host]
我想通过Python访问D,使用paramiko和/或sshtunnel。所有的我能找到的信息包括:
- 单个SSH通道和远程SQL主机(实施例A - > C => d,没有跳跃主机)
- 一个到SQL主机的双重ssh隧道(例如A - > B - > C,D托管在C上)。
到目前为止,我使用的是代理命令的paramiko从A到C.我可以通过执行命令访问d在C上,而不是通过连接mysqldb或sqlalchemy(我的最终目标)。
我当前的代码:
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;博士:我如何前进一个端口通过Python中的两个ssh跳转?
我想出了[答案](https://stackoverflow.com/a/44739471/6412017) – blep