VSCode Remote-SSH 频繁断开根本原因是 SSH 底层保活未配对:必须在 ~/.ssh/config 中成对配置 ServerAliveInterval 60 和 ServerAliveCountMax 3,并在 /etc/ssh/sshd_config 中同步设置 ClientAliveInterval 60 与 ClientAliveCountMax 3,且重启 sshd;仅改一端必断。

VSCode Remote-SSH 频繁断开,不是插件问题,是 SSH 底层保活没配对——只改客户端或只改服务端,必断。
ServerAliveInterval 和 ServerAliveCountMax 必须成对写进 ~/.ssh/config
VSCode Remote-SSH 调用的是你本地的 ssh 命令,完全遵循 OpenSSH 规则。它不读 VSCode 设置里的 remote.SSH.keepAlive,那个字段只管 UI 层控制通道,对终端、端口转发、文件监听无效。
-
ServerAliveInterval 60:客户端每 60 秒发一次空包探测服务端是否存活(不是数据,只是 TCP 层探测) -
ServerAliveCountMax 3:连续 3 次没收到响应才断开连接;如果只设ServerAliveInterval不设ServerAliveCountMax,OpenSSH 会用默认值 0,导致“一丢就断” - 必须写在
~/.ssh/config对应Host块里,不能只靠命令行临时加参数(Remote-SSH 不走命令行) - 别信
TCPKeepAlive yes单独起作用——它只在 TCP 层生效,穿不过 NAT 或防火墙;真正管用的是应用层心跳ServerAlive*系列
ClientAliveInterval 和 ClientAliveCountMax 必须同步配在 /etc/ssh/sshd_config
光客户端发心跳不够。如果服务端 sshd 自己先判定客户端失联,照样单方面关闭连接。很多断连日志里出现 Connection closed by remote host 就是这个原因。
- 登录远程服务器,确认
/etc/ssh/sshd_config中这三项未被注释且值合理:ClientAliveInterval 60、ClientAliveCountMax 3、TCPKeepAlive yes -
ClientAliveInterval和ServerAliveInterval值必须一致(推荐 60),否则节奏错位,服务端可能比客户端更早放弃连接 - 改完必须执行
sudo systemctl restart sshd;Docker 启动的 sshd 可能忽略该文件,需启动时加-o ClientAliveInterval=60 - 某些云厂商控制台自带 SSH 终端会绕过
sshd_config,这类环境要单独验证
VSCode settings.json 里这几个键值不能少
它们不替代 SSH 保活,但能缓解断连后的体验断层。尤其当网络抖动导致短暂失联时,这些配置决定你是手动重连,还是自动恢复上下文。
-
"remote.autoReconnect": true:断开后自动尝试重连(注意:不是“保持连接”,是“断了就重试”) -
"remote.SSH.showLoginTerminal": true:连接失败时弹出终端日志,方便定位卡在哪一步(比如卡在Permission denied (publickey)还是Connection timed out) -
"remote.SSH.useLocalServer": false:强制走系统ssh客户端,避免 Remote-SSH 自带精简版不认~/.ssh/config里的保活参数 - 别开
ControlMaster或ControlPersist:VSCode 内部已实现连接复用,开启反而引发竞态和权限冲突
容易被忽略的隐性断连诱因
即使所有保活参数都配对生效,仍可能卡在 Opening remote... 或终端无响应。这时候问题不在连接层,而在远程环境本身。
- 远程
/tmp不可写或磁盘满:vscode-server安装失败但错误被静默吞掉,表现为无限等待;检查df -h和ls -ld /tmp - 远程 shell 启动脚本(如
~/.bashrc)含阻塞操作:比如卡在git status、等待用户输入、执行耗时命令;VSCode 启动时会加载完整 shell 环境,建议加[ -z "$PS1" ] && return守卫非交互逻辑 - WSL2 下使用 Remote-SSH:虚拟网卡有时触发 NAT 超时,需在 WSL2 中运行
echo "net.ipv4.tcp_keepalive_time = 60" | sudo tee -a /etc/sysctl.conf && sudo sysctl -p - 远程服务器内存紧张:编译时瞬间打满内存导致
vscode-server进程被 OOM killer 杀掉,现象是终端突然空白、文件浏览卡死
保活参数配对只是起点,真正的稳定性取决于客户端、服务端、网络中间设备三者节奏一致。最容易漏掉的是服务端 ClientAliveInterval 没重启生效,或者本地 ~/.ssh/config 权限不对(必须是 600),这两处一错,其他全白配。


















