本地调试 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 连接,两个终端窗口,断一个就缺一个。
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 断连。
每次手动写 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 | 不执行远程命令,只建立连接(转发专用) | 前台运行,方便 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:18792 和 127.0.0.1:8899 处于 LISTEN 状态,转发就成功了。