← 听不懂

SSH 多端口本地转发合并为单条命令

2026-03-11 运维 SSH端口转发local forwardSSH config

场景

本地调试 EC2 上的服务,需要同时访问:

之前的做法是开两个终端,各跑一条 ssh -L,很蠢。

错误做法

# 终端 1

ssh -L 18792:localhost:18792 ec2-user@your-ec2-ip -N

# 终端 2

ssh -L 8899:localhost:8899 ec2-user@your-ec2-ip -N

两个 SSH 连接,两个终端窗口,断一个就缺一个。

正确做法:一条命令叠加多个 -L

ssh -L 18792:localhost:18792 \

-L 8899:localhost:8899 \

-o ServerAliveInterval=30 \

-o ServerAliveCountMax=3 \

-N ec2-user@your-ec2-ip

ServerAliveInterval=30 每 30 秒发一个 keepalive 包,防止长时间不操作时 SSH 断连。

进阶:写进 ~/.ssh/config

每次手动写 IP 和端口太麻烦。把常用配置写进 SSH config 文件:

# ~/.ssh/config

Host ec2-dev

HostName your-ec2-ip

User ec2-user

IdentityFile ~/.ssh/your-key.pem

LocalForward 18792 localhost:18792

LocalForward 8899 localhost:8899

ServerAliveInterval 30

ServerAliveCountMax 3

配置完成后,一行命令搞定所有端口转发:

ssh -N ec2-dev

-N vs -f 参数说明

| 参数 | 含义 | 适用场景 |

|-----|------|--------|

| -N | 不执行远程命令,只建立连接(转发专用) | 前台运行,方便 Ctrl+C 关闭 |

| -f | 进入后台运行 | 不想占用终端 |

| -N -f | 后台建立连接,不执行命令 | 启动后不管它 |

# 前台(看得见,Ctrl+C 可关)

ssh -N ec2-dev

# 后台(自动退到 shell)

ssh -N -f ec2-dev

# 后台启动后,关闭方式:

pkill -f "ssh -N.*ec2-dev"

# 或

kill $(pgrep -f "ssh -N")

验证转发是否成功

# 建立转发后,在本地另一个终端检查端口是否在监听

ss -tlnp | grep -E '18792|8899'

# 或

lsof -i :18792

lsof -i :8899

看到 127.0.0.1:18792127.0.0.1:8899 处于 LISTEN 状态,转发就成功了。