共253行
2026-05-27 12:57:34
在 服务器A(上海) 上执行一条命令,建立一条后台常驻的 SSH 隧道,把 A 本地的一个端口(比如 3307)映射到 服务器B(杭州) 的数据库端口(3306)。
之后你在 A 上连接 localhost:3307 = 直接操作 B 的数据库,全程内网安全、不掉线。
ssh -fN -L 3307:127.0.0.1:3306 用户名@B的公网IP -o ServerAliveInterval=30 -o ServerAliveCountMax=3-fN:后台运行,不执行远程命令(专门做隧道用)3307:A 本地端口(你自己随便改,不冲突就行)127.0.0.1:3306:B 上数据库的地址和端口用户名@B的公网IP:B 的登录账号 + 公网 IP-o ServerAlive...:保活机制,确保隧道不会断执行后输入 B 服务器的密码,隧道就后台常驻了。
隧道建好后,直接在 A 上执行:
mysql -h 127.0.0.1 -P 3307 -u数据库账号 -p主机:127.0.0.1
端口:3307
账号:你的数据库账号
密码:你的数据库密码
这就是在操作服务器 B 上的数据库!
这条命令自带 保活机制:
ps aux | grep "ssh -fN -L 3307"kill 进程IDssh -fN -L 3307:127.0.0.1:3306 user@B公网IP -o ServerAliveInterval=30mysql -h127.0.0.1 -P3307 -u账号 -ppkill -f "ssh -fN -L 3307"这里提供一键启动、一键关闭脚本,附带使用说明、保活配置、异常处理,开箱即用(以MySQL 3306、本地映射端口3307为例)。
环境:CentOS / Ubuntu 通用;提前配置好SSH免密登录(避免反复输密码)
在服务器A执行,实现免密连接B,脚本才能后台自动运行:
# 1. 生成密钥(一路回车,无需设置密码)
ssh-keygen -t ed25519
# 2. 推送公钥到服务器B
ssh-copy-id 你的B服务器用户名@B公网IP测试免密:ssh 用户名@B公网IP,无需输密码即成功。
ssh_tunnel_start.shvim ssh_tunnel_start.sh粘贴以下内容,修改两处自定义参数:
#!/bin/bash
# 配置项 请根据实际修改
LOCAL_PORT=3307 # A机器本地映射端口
REMOTE_DB_PORT=3306 # B机器数据库端口
SSH_USER="b_user" # B服务器SSH用户名
SSH_IP="B的公网IP" # B服务器公网IP
# 检查端口是否已被占用
if netstat -tulpn | grep -q ":$LOCAL_PORT " ;then
echo "端口 $LOCAL_PORT 已占用,隧道已存在,无需重复启动"
exit 0
fi
# 启动SSH隧道 + 保活(后台运行)
ssh -fN -L $LOCAL_PORT:127.0.0.1:$REMOTE_DB_PORT \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=3 \
$SSH_USER@$SSH_IP
# 校验启动结果
if [ $? -eq 0 ];then
echo "✅ SSH隧道启动成功,本地端口:$LOCAL_PORT"
else
echo "❌ SSH隧道启动失败"
fi# 添加执行权限
chmod +x ssh_tunnel_start.sh
# 启动隧道
./ssh_tunnel_start.shssh_tunnel_stop.shvim ssh_tunnel_stop.sh粘贴内容(端口和上面保持一致即可):
#!/bin/bash
LOCAL_PORT=3307
# 匹配隧道进程并终止
pkill -f "ssh -fN -L $LOCAL_PORT"
if [ $? -eq 0 ];then
echo "✅ SSH隧道已关闭"
else
echo "ℹ️ 未找到运行中的隧道"
fichmod +x ssh_tunnel_stop.sh
# 关闭隧道
./ssh_tunnel_stop.sh./ssh_tunnel_start.sh隧道后台常驻、自动保活,全程不断连。
# MySQL 连接示例
mysql -h 127.0.0.1 -P 3307 -u 数据库账号 -p也可用于代码、可视化工具(Navicat/DBeaver)连接 127.0.0.1:3307。
./ssh_tunnel_stop.shps aux | grep ssh
netstat -tulpn | grep 3307若 3307 被占用,修改脚本内 LOCAL_PORT 为任意未占用端口(如 3308、3309)。
只修改脚本内这一行即可:
REMOTE_DB_PORT=5432连接命令:
psql -h 127.0.0.1 -p 3307 -U 数据库用户名 库名ServerAliveInterval=30 每30秒心跳,防止公网连接断开。如果想前台运行、实时看日志(关闭终端即断隧道),执行:
ssh -L 3307:127.0.0.1:3306 b_user@B公网IP按 Ctrl+C 直接断开隧道。