vscode remote-ssh 频繁断开主因是 ssh 层未维持连接:必须在 ~/.ssh/config 中为匹配主机名的 host 段配 serveraliveinterval 60 和 serveralivecountmax 3,且服务端 /etc/ssh/sshd_config 需同步启用 clientaliveinterval 60 与 clientalivecountmax 3 并重启 sshd,二者缺一不可。

VSCode Remote-SSH 频繁断开,90% 不是 VSCode 的错,而是 SSH 连接根本没维持住——空闲时没人发心跳包,中间网络设备(比如公司防火墙、家用路由器)直接把 TCP 连接回收了。
为什么 ~/.ssh/config 里的 ServerAliveInterval 没生效
常见错误现象:配了 ServerAliveInterval 60,但连接仍 2 分钟就断;ps aux | grep ssh 查不到该参数出现在进程命令行里。
-
Host别名必须和 VSCode 连接时填的主机名**完全一致**(大小写、连字符、点号都不能差) - 别写在
Host *通配段里——Remote-SSH 有时会跳过它 - Windows 用户注意:PowerShell 或 CMD 下改的
%USERPROFILE%\.ssh\config可能不生效;WSL 或 Git Bash 的~/.ssh/config才真正被调用 -
ServerAliveInterval必须和ServerAliveCountMax成对出现;只设前者,OpenSSH 会用默认ServerAliveCountMax 0(收不到响应立刻断)
服务端 sshd 必须同步开启 ClientAliveInterval
客户端发心跳,服务端不回,等于白发。很多云服务器镜像默认关闭该功能,或值设得太小(比如 ClientAliveInterval 30),反而比客户端更早动手断连。
- 登录服务器,检查
/etc/ssh/sshd_config中这三行是否启用且数值合理: ClientAliveInterval 60ClientAliveCountMax 3TCPKeepAlive yes- 改完必须执行
sudo systemctl restart sshd(macOS 用sudo launchctl kickstart -k system/com.openssh.sshd) - 容器化环境(如 Docker 启动的 sshd)可能忽略配置文件,需启动时加
-o ClientAliveInterval=60参数
VSCode 自身设置里哪些有用、哪些纯属干扰
remote.SSH.keepAlive 是个典型误导项:它只控制 VSCode UI 层的控制通道(比如设置同步、命令面板响应),对终端、端口转发、文件监听等子通道完全无效。
- 真正有用的只有这两个:
-
"remote.autoReconnect": true—— 断开后自动弹出重连按钮(不是“不断连”,是“断了再试”) -
"remote.SSH.showLoginTerminal": true—— 连接失败时弹出终端日志,能看到卡在哪一步(比如卡在Installing VS Code Server就不是保活问题) -
remote.ssh.useLocalServer在 Windows 上可临时绕过 OpenSSH 7.7p1 的保活 bug(旧版 PowerShell 内置 SSH 对非交互连接不触发ServerAliveInterval)
验证心跳是否真在工作
连上后,在 VSCode 内置终端里运行:ps aux | grep ssh,应看到类似:
ssh -F /dev/null -o ConnectTimeout=15 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 ...
如果没看到 ServerAliveInterval,说明配置没被读到;如果看到但依然断连,大概率是服务端 sshd 拒绝响应——此时要查服务端日志:sudo journalctl -u sshd -n 50 --no-pager | grep "ClientAlive"。
最易被忽略的一点:远程服务器的 /tmp 目录不可写或磁盘满,会导致 VSCode Server 安装失败,表现为“假连接”(状态栏显示已连接,但终端无响应、文件浏览卡死),这种情况下调任何保活参数都没用。











