ssh终端假死是因中间设备回收空闲连接,需客户端配serveraliveinterval/serveralivecountmax保活,并确保服务端sshd启用clientaliveinterval/clientalivecountmax且重启sshd。

Remote SSH 连接后终端卡住、命令无响应,但连接状态显示“已连接”
这是典型的 SSH 会话假死,不是真断开,VSCode 还在维持连接通道,但底层 TCP 流量停滞。根本原因通常是网络中间设备(如路由器、防火墙、公司代理)主动回收了空闲连接,而客户端和服务端都没发 KeepAlive 探测包。
解决思路是让 SSH 主动保活,而不是等 VSCode 或系统层面兜底:
- 在本地
~/.ssh/config中为对应 Host 添加:Host your-remote-host HostName 192.168.1.100 User ubuntu ServerAliveInterval 60 ServerAliveCountMax 3 -
ServerAliveInterval 60表示每 60 秒向服务端发一次空包;ServerAliveCountMax 3表示连续 3 次失败才断开,避免偶发丢包误判 - 别改 VSCode 的
remote.SSH.keepAlive设置——它只影响 VSCode 自身的控制通道,对终端/端口转发/文件同步等子通道无效
SSH 配置生效但依然频繁断连,检查服务端 sshd 是否禁用了 ClientAlive
即使客户端发保活包,如果服务端 sshd 配置里关掉了接收逻辑,照样没用。常见于云服务器默认镜像或加固过的系统。
登录服务器,检查 /etc/ssh/sshd_config:
- 确认存在且未被注释的配置项:
ClientAliveInterval 60 ClientAliveCountMax 3
- 如果只有
TCPKeepAlive yes,不够——它只检测底层 TCP 连通性,无法穿透 NAT 设备老化机制 - 改完必须执行
sudo systemctl restart sshd,否则不生效 - 某些容器化环境(如 Docker 启动的 sshd)可能忽略全局配置,需在启动命令中显式传参
Windows 上用 OpenSSH 客户端连接 Linux 时,ServerAliveInterval 不生效
Windows 自带的 OpenSSH(PowerShell 6+ 内置)早期版本(ServerAliveInterval 在非交互式连接(如 VSCode Remote SSH 启动的后台连接)中会被忽略。
验证和修复方式:
- 运行
ssh -V,若输出类似OpenSSH_for_Windows_7.7p1,就属于问题版本 - 升级到 Windows 11 22H2+ 或手动安装新版 OpenSSH:从 GitHub Win32-OpenSSH 下载并替换
C:\Windows\System32\OpenSSH\下的文件 - 或者临时绕过:在 VSCode 设置中关闭
remote.ssh.useLocalServer,强制走独立 SSH 进程(会多一个node进程),有时能触发保活逻辑
连接看似稳定,但文件浏览/上传经常卡在“正在加载”
这不是 SSH 断连,而是 VSCode Remote 的 SFTP 子通道超时。它复用主连接,但有自己的读写超时策略,且不继承 ServerAliveInterval。
关键参数在 VSCode 设置里调整:
- 设置
remote.ssh.fileTransferTimeout为30000(毫秒),避免小文件也因网络抖动失败 - 禁用
remote.ssh.enableDynamicForwarding(默认 false),开启后可能干扰 SFTP 路由路径 - 如果服务器磁盘 I/O 高或
/tmp满,VSCode 会在那里建临时 socket,导致 SFTP 初始化卡住——检查df -h /tmp和iotop
ClientAlive* 配置和 Windows 客户端版本兼容性——这两处不动,光调 VSCode 设置基本白忙。











