Mac终端SSH闲置断连是因缺少心跳包,可通过配置ServerAliveInterval 60和ServerAliveCountMax 3实现每60秒发心跳、3次失败才断开,支持用户级(~/.ssh/config)或全局级(/etc/ssh/ssh_config)设置,也可临时用-o参数验证。

Mac终端用SSH连接服务器后,闲置几分钟就卡住或直接断开,命令输出中断、光标不响应,重新登录又得重跑命令——这是客户端没发心跳包导致服务器主动回收连接。
给当前用户配置长连接(推荐)
这一步只影响你自己的终端,不用sudo权限,改完立刻生效,最安全也最常用。
第一步:打开用户级SSH配置文件,运行:
mkdir -p ~/.ssh && touch ~/.ssh/config && open -e ~/.ssh/config
第二步:在打开的文本编辑器里,粘贴以下三行内容(注意Host *前后有空格,参数名和值之间用一个空格隔开):
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
第三步:保存文件并关闭编辑器。下次新打开终端窗口再ssh连接,就会自动启用心跳机制——每60秒向服务器发一次空包,连续3次没收到响应才断开,实际可维持数小时无操作不断连。
⚠️注意:如果~/.ssh/config已存在且含其他Host块,请确保新添加的Host *放在最底部,否则可能被前面更具体的Host规则覆盖。
全局修改客户端配置(所有用户生效)
适用于多账户共用一台Mac、或需要让Git/VS Code Remote等工具也继承该设置的场景。
执行命令:
sudo vim /etc/ssh/ssh_config
定位到文件末尾,在# KeepAlive部分附近(或任意空白行),添加两行:
ServerAliveInterval 60
ServerAliveCountMax 3
保存退出后,无需重启任何服务——所有新建立的SSH连接都会立即使用该配置。
【必须确认】该文件中不能存在重复的ServerAliveInterval或ServerAliveCountMax行,否则以最后一组为准,容易误配。
临时验证配置是否起效
不想改配置文件?用一条命令就能马上测试心跳是否发出:
运行:
ssh -o ServerAliveInterval=30 -o ServerAliveCountMax=2 user@host
连接成功后,保持终端前台空闲,等待30秒左右,观察是否仍可输入命令;若30秒后终端未冻结,说明心跳已工作。
加-vvv参数还能看到底层日志:
ssh -o ServerAliveInterval=30 -vvv user@host | grep "send packet.*80"
只要出现debug3: send packet: type 80,就代表心跳包已发出。











