SSH 隧道 和 subprocess:Python 里管进程
- SSH 隧道:终端直接用
建隧道(后台运行)
ssh -N -L 3330:内网DB地址:3306 -i ~/.ssh/id_rsa user@跳板机IP &
验证是否通了
nc -zv 127.0.0.1 3330
# 输出 succeeded 即成功
用完后关掉
pkill -f "ssh -N -L 3330"
- subprocess:Python 里管进程
启动后台进程(不阻塞)
点击查看代码
import subprocess
proc = subprocess.Popen(
["ping", "-c", "100", "baidu.com"],
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL
)
print(f"已启动,PID={proc.pid}")
# 立即返回,不会卡在这里
等它跑完 / 主动杀掉
点击查看代码
# 方式A:等它自己结束
proc.wait()
# 方式B:不用了,手动杀
proc.terminate()
- 两者搭配:完整可复制代码块
直接存成 db_tunnel.py,改四个变量就能用:
点击查看代码
import subprocess, time, pymysql
# ====== 改这里 ======
JUMP_HOST = "跳板机IP"
SSH_KEY = "/path/to/id_rsa"
DB_HOST = "内网MySQL地址"
LOCAL_PORT = 3330
# ====================
# 1. 起隧道
cmd = [
"ssh", "-N",
"-L", f"{LOCAL_PORT}:{DB_HOST}:3306",
"-i", SSH_KEY,
"-o", "ExitOnForwardFailure=yes",
f"user@{JUMP_HOST}"
]
ssh = subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
time.sleep(2) # 等握手
# 2. 连库(跟直连写法完全一样)
conn = pymysql.connect(host="127.0.0.1", port=LOCAL_PORT, user="root", password="xxx", db="test")
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM users")
print(cursor.fetchone())
# 3. 收尾
conn.close()
ssh.terminate()

浙公网安备 33010602011771号