博主头像
mxd's Blog

以技术为翼,以生活为魂

解决ssh会话长时间无操作卡死/断开连接

症状

我不知道你们有没有这样的情景,用ssh user@host连接了服务器过后,因为各种原因,耽误了>=5分钟左右,然后回过头来发现终端跑的ssh已经无法输入,开始狂敲Enter...

又或者是,正在跑某个又臭又长的脚本,挂到后台,再回来看,竟然提示client_loop: send disconnect: Broken pipe

以上这两种场景,相信无论是新手还是老手都遇见过,反正我每次遇见这种情况恨不得骂人*

解决办法

方法一:如果您有多台服务器,相当于一对多,比如要连接不同虚拟机/服务器进行开发,不想在每台服务器上设置,只需在客户端的 ~/.ssh/ (Windows C:\Users\你的用户名\.ssh) 文件夹中添加 config 文件,并添加下面的配置:

ServerAliveInterval 60

方法二:如果您有多个人管理服务器,相当于多对一,或者是经常在不同的电脑上连接同一个服务器,不想在每个客户端进行设置,只需在服务器的 /etc/ssh/sshd_config添加如下的配置,注意如果原本有的话放开注释就行了

ClientAliveInterval 60

保存后记得重启重启sshd服务,使配置生效:

sudo systemctl restart sshd

方法三:如果您只想让当前的 ssh 临时保持连接,可以使用以下的命令:

ssh -o ServerAliveInterval=60 user@host

调整

  1. ClientAliveInterval 60
    单位:秒
    含义:sshd 每隔 60 秒主动给客户端发送一次保活探测包,验证连接是否仍然有效。
  2. ClientAliveCountMax 3
    单位:次
    含义:服务器发出保活探测后,若连续 3 次都收不到客户端回应,则判定连接已失效,强制断开。

参考

解决ssh会话长时间无操作卡死/断开连接
https://blog.mxdyeah.com/post/ssh-idle-hang-fix
本文作者 mxdyeah
发布时间 2025-10-18
许可协议 CC BY-NC-SA 4.0
已有 2 条评论
  1. 评论头像

    这是一个典型的理论上有用但是实践上效果不明显的案例,如果你的服务器物理距离较远线路又差,在60s以内就极有可能因为多次丢包让SSH直接卡死,所以最好降低保活包的间隔时间才能及时察觉连接异常,我个人推荐5s。

    xfox October 19, 2025 19:19   GNU/Linux x64(GNU/Linux x64) / Google Chrome 140.0.0.0(Google Chrome 140.0.0.0) 回复
    1. 评论头像

      也对,不同情况不同分析

      mxdyeah 博主 October 25, 2025 18:55   FreeBSD(FreeBSD) / Firefox 145.0(Firefox 145.0) 回复
发表新评论

AD: