SSH保活需在~/.ssh/config中配置ServerAliveInterval 60和ServerAliveCountMax 3,VSCode Remote-SSH插件依赖该配置;参数需与Host别名严格匹配,且服务端ClientAliveInterval应为0或大于客户端值,否则仍会掉线。

SSH配置文件里加ServerAliveInterval和ServerAliveCountMax
VSCode本身不管理SSH连接的保活逻辑,它完全依赖系统级的ssh命令和~/.ssh/config配置。掉线根本原因是服务端主动关闭了空闲连接,必须靠客户端定期发心跳包来维持。
在~/.ssh/config对应主机段里加上这两行:
Host my-server
HostName 192.168.1.100
User ubuntu
ServerAliveInterval 60
ServerAliveCountMax 3
ServerAliveInterval 60表示每60秒发一次SSH_MSG_GLOBAL_REQUEST探测包;ServerAliveCountMax 3表示连续3次没收到响应才断开(即最多容忍3分钟无响应)。两者配合,能有效防掉线,又不会把假死连接拖太久。
- 别只设
ServerAliveInterval不设ServerAliveCountMax——默认值是3,但显式写出来更可控 - 值不是越大越好:
ServerAliveInterval设成300(5分钟)基本等于没用,很多服务器TCPKeepAlive超时就4分钟 - Windows用户注意:WSL里的
~/.ssh/config才生效,不是PowerShell或CMD下的路径
VSCode Remote-SSH插件会读取系统SSH配置
Remote-SSH插件底层调用的就是你本地装的ssh命令,所以它天然继承~/.ssh/config和/etc/ssh/ssh_config里的所有设置,包括保活参数。
验证是否生效:连上后在VSCode终端里执行ps aux | grep ssh,能看到类似这样的进程:
ssh -F /dev/null -o ConnectTimeout=15 -o ControlMaster=no -o ControlPersist=1m -o ServerAliveInterval=60 -o ServerAliveCountMax=3 ...
如果没看到ServerAliveInterval等参数,说明配置没被读到,大概率是~/.ssh/config里Host别名和VSCode里填写的主机名不一致。
- VSCode连接时填的是
my-server,那配置里Host必须严格匹配,大小写、空格都不能错 - 别把配置写在
Host *里试图“全局生效”——Remote-SSH有时会跳过通配规则 - Mac上如果用了Keychain,确保
UseKeychain yes和保活参数共存,二者不冲突
服务器端sshd_config限制可能覆盖客户端设置
客户端发心跳,服务端得愿意回。如果服务器开了ClientAliveInterval且值比你的ServerAliveInterval小,那它会先动手断连;如果关了TCPKeepAlive,某些防火墙会直接掐掉长连接。
检查服务器/etc/ssh/sshd_config里这几项:
-
ClientAliveInterval 0(默认)表示服务端不主动探测,此时客户端保活才起决定作用 -
TCPKeepAlive yes建议保持开启,它是底层TCP层保活,和SSH应用层心跳互补 - 避免
ClientAliveInterval 30+ClientAliveCountMax 1这种激进组合,会导致客户端还没发心跳就被踢
改完记得sudo systemctl reload sshd,不要只重启连接。
连接后仍掉线?优先查ssh -v日志和网络中间设备
保活配置正确但还是掉线,问题往往不在SSH本身。用ssh -v -F ~/.ssh/config my-server手动连一次,看最后几行有没有debug1: channel 0: window 1024000 sent adjust 128这类正常通信日志,还是直接卡在debug1: Connection died, clearing up.。
常见干扰源:
- 公司防火墙或NAT网关有5分钟空闲连接自动回收策略,再强的SSH保活也扛不住
- WiFi切换、休眠唤醒后本地网络栈异常,
ssh进程还在但TCP连接已失效 - 服务器负载过高,
sshd进程卡住无法响应心跳包
这时候ServerAliveInterval设太短(比如10秒)反而加重服务器负担,不如接受现实——加个autossh做自动重连更实际。
保活不是万能胶,它只解决“空闲掉线”这一种情况;网络抖动、服务崩溃、权限变更这些,得靠别的手段兜底。


















