问题描述
使用 SSH 连接远程服务器,长时间没有输入任何命令后,客户端输入命令经常出现无响应、假死的现象。
原因分析
- 连接链路上的网络设备为了节省网络资源,主动断开了 TCP 连接。具体来说,网络设备维护了一张
连接状态表, 为了避免连接状态表存放大量无效的连接,设置了超时机制。如果在规定时间内连接没有传输任何数据包,就认为该连接无效,从而断开对应的连接。 - 客户端不知道连接已经断开,继续保持
连接中的状态
解决方案
有两种解决方案:
- 修改客户端的 SSH 配置(推荐)
- 修改服务端的 SSH 配置(需要服务器权限)
修改客户端的 SSH 配置
修改客户端的 SSH 配置无需服务器权限,操作简单,修改完后立即生效,推荐使用。操作如下:
在 ~/.ssh/config 文件中新增如下的内容:
Host * # `*` 表示对所有的服务器使用下方的配置
ServerAliveInterval 60 # 每隔 60s 向服务器发送一次心跳包
ServerAliveCountMax 3 # 服务器连续 3 次未响应心跳包则主动断开连接
修改服务器的 SSH 配置
编辑 /etc/ssh/sshd_config 文件,在文件中新增如下的内容:
ClientAliveInterval 60 # 每 60 秒向客户端发送一次心跳包
ClientAliveCountMax 3 # 客户端连续 3 次未响应心跳包则主动断开连接