AIGC标识 SSH 隧道 和 subprocess:Python 里管进程

  1. 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"

  1. 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()
  1. 两者搭配:完整可复制代码块
    直接存成 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()
使用原则:能直连就别用这段代码。只有本地调不通内网库时,才把它拿出来当工具用。
posted @ 2026-09-10 09:59  不知者buwei  阅读(0)  评论(0)    收藏  举报