保持SSH会话不断开
约 532 字大约 2 分钟
2026-08-29
SSH 连接闲置一段时间后自动断开,是客户端、服务端或中间网络设备的空闲超时所致。本文提供三种保活方法,以及长任务的正确做法。
方法一:客户端保活(推荐,改动最小)
编辑本地 ~/.ssh/config(Windows 在 C:\Users\用户名\.ssh\config),加入:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3含义:每 60 秒向服务器发送一次心跳,连续 3 次无响应才断开。对所有连接生效,也可只针对某台服务器写(把 Host * 改为别名)。
单次连接临时使用:
ssh -o ServerAliveInterval=60 root@<实例IP>方法二:服务端保活
在实例上修改 /etc/ssh/sshd_config:
ClientAliveInterval 60
ClientAliveCountMax 3sudo systemctl restart sshd对连接这台实例的所有客户端生效。修改 SSH 配置时注意安全,参见SSH安全加固清单。
方法三:终端工具自带保持功能
Xshell:会话属性 → 连接 → 勾选保持活动状态,设置间隔(如 60 秒)。
更彻底的做法:让任务脱离连接运行
保活只是减少断连,长任务(编译、大文件传输、备份)应当脱离 SSH 会话运行,这样即使断开也不中断:
# 方式一:tmux(推荐,断开后可随时接回)
sudo apt install tmux -y # 或 sudo dnf install tmux
tmux # 进入会话,在其中执行长任务
# 断开后重新接回:tmux attach
# 方式二:nohup
nohup ./long-task.sh > task.log 2>&1 &常见问题
配置了还是过一会儿就断?
- 确认配置文件所在端正确(客户端 config 对所有出站连接生效;sshd_config 只影响该实例)。
- 本地 Wi-Fi/运营商 NAT 空闲超时也可能主动断链,缩短
ServerAliveInterval(如 30)再试。 - 公司防火墙对长连接限时的,只能靠 tmux 方式兜底。
断开前正在执行的命令被中断了吗?
会。SSH 断开时其会话内进程通常收到挂断信号——这正是推荐用 tmux/nohup 跑长任务的原因;已被中断的任务重新执行即可。
