解决MacOS与Ubuntu虚拟机之间的SSH连接无活动超时问题
解决MacOS与Ubuntu虚拟机之间的SSH连接无活动超时问题
我之前也碰到过一模一样的情况——用VS Code通过SSH连Ubuntu VM,没一会儿就弹出client_loop: send disconnect: Broken pipe,折腾了好几天才找到几个靠谱的解决办法,给你分享下:
一、先确保Ubuntu端的SSHD配置真的生效了
很多人改了配置却忘了重启服务,导致设置白搭:
- 打开Ubuntu的SSHD配置文件:
sudo nano /etc/ssh/sshd_config - 确认以下配置没有被注释(去掉前面的
#),可以把ClientAliveCountMax调得更高一点,增加重试次数:TCPKeepAlive yes ClientAliveInterval 30 ClientAliveCountMax 10 - 保存退出后,重启SSHD服务:
sudo systemctl restart sshd - 验证配置是否生效:
执行后能看到当前生效的sshd -T | grep clientaliveclientaliveinterval和clientalivecountmax参数,说明配置已经生效了。
二、优化Mac端的SSH配置,避免参数冲突
你之前把TCPKeepAlive设为no,其实可以改成yes和Ubuntu端匹配,再补充几个参数增强稳定性:
- 打开Mac的SSH配置文件:
nano ~/.ssh/config - 针对你的Ubuntu VM添加或修改配置:
Host ubuntu-vm # 这里填你的VM名称或IP TCPKeepAlive yes ServerAliveInterval 20 # 缩短心跳间隔,更频繁发送保活包 ServerAliveCountMax 10 ExitOnForwardFailure no ConnectTimeout 0 # 取消连接超时限制 - 保存后,关掉所有已有的SSH连接,重新通过VS Code连接试试。
三、调整VS Code Remote SSH的专属设置
有时候VS Code会忽略系统级的SSH配置,用自己的参数,所以直接在VS Code里设置更稳妥:
- 打开VS Code,按
Cmd+,(Windows是Ctrl+,)打开设置面板 - 搜索以下几个选项并修改:
remote.SSH.serverAliveInterval:设置为20remote.SSH.serverAliveCountMax:设置为10remote.SSH.connectTimeout:设置为0(表示不限制连接超时)
- 重启VS Code,重新连接虚拟机,看看还会不会超时。
四、检查虚拟机的网络模式
如果你的Ubuntu VM用的是NAT模式,很可能是宿主机的网络转发机制回收了空闲连接,建议改成桥接模式:
- 打开虚拟机软件(比如VirtualBox或VMware),找到你的Ubuntu VM的网络设置,把网络连接方式改成“桥接适配器”
- 重启虚拟机后,它会和Mac处于同一个局域网,连接稳定性会提升很多,减少无活动超时的概率。
五、排查Mac的节能与防火墙设置
Mac的节能模式或防火墙也可能导致SSH连接中断:
- 打开Mac的「系统设置」→「电池」→「节能」,确保“接通电源时防止电脑自动进入睡眠”(笔记本)或“防止电脑自动进入睡眠”(台式机)是勾选状态
- 打开「系统设置」→「网络」→「Wi-Fi」→「高级」,勾选“唤醒以供Wi-Fi网络访问”,避免Wi-Fi休眠导致断连
- 打开「系统设置」→「网络」→「防火墙」,确认允许SSH(远程登录)的出站和入站连接。
终极方案:用autossh自动重连
如果以上方法都没解决,可能是路由器或网络环境的问题(比如路由器会自动回收空闲连接),可以试试用autossh实现自动重连:
- 在Ubuntu上安装autossh:
sudo apt install autossh - 在Mac上用autossh连接Ubuntu:
这样即使连接断了,autossh会自动帮你重新连上,完美解决无活动超时的问题。autossh -M 0 -o "ServerAliveInterval 20" -o "ServerAliveCountMax 10" your-username@ubuntu-vm-ip
备注:内容来源于stack exchange,提问作者Robot




