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에 접근하고 싶습니다. 내가 찾을 수있는 모든 정보는 포함한다 :
- 하나의 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 : 어떻게 앞으로 내가 할 파이썬에서 두 개의 ssh 점프를 통한 포트?
[대답] (https://stackoverflow.com/a/44739471/6412017)을 알아 냈습니다. – blep