ChrAlpha's Blog

使 SSH 保持长时间连接

2020-01-27·便签格

众所周知,为了保护服务器及其拥有者利益,在使用 SSH 连接远程服务器的时候,如果终端(在我认为比较短的)一段时间内没有行为,那么 SSH 就会断开连接,并返回:

packet_write_wait: Connection to xxx.xxx.xxx.xxx port xxxx: Broken pipe

不仅如此,在你反应过来想再控制终端的时候,还会发生一点卡顿才断开,这着实有点恼人。

这里记录下 保持一定时间连接 的方法。

测试环境:

VPS: Ubuntu 18.04

本地: macOS 10.14


服务端实现

(可能需要 root 权限,建议直接在 root 用户下进行)

使用 vi/vim 打开 /etc/ssh/sshd_config 文件,找到如下两行:

ClientAliveInterval 
ClientAliveCountMax

解释一下:

第一个 ClientAlivaTnterval 字面意思是 客户端存活间隔 ,比如设置 ClientAliveInterval 60 指的是:服务端每隔 60 发送一次空包 (null packet) 到客户端,监测是否有回应,并保持连接。

第二个 ClientAliveCountMax 指的是 客户端在以 ClientAliveInterval 的间隔请求了多少次才会断开连接,比如设置 ClientAliveCountMax 10 ,结合上面的设置,意思是:如果服务端每 60 秒发送一个包给客户端,发送 10 次以后(也就是 600 秒)仍没有回应,则服务端主动断开连接。

设置好后执行命令重载 SSH 配置:

systemctl restart sshd

这样就实现了全局控制,任何连接这台服务器的客户端都会保持着这样的一个「心跳频率」,大家可以根据自己习惯设定,注意间隔不要太长。


客户端实现

我们也可以让本地客户端发送请求到服务端保持连接。

在本地 SSH 文件夹 (.ssh) 内,如果你已经配置了 SSH 密匙连接,只需要在对应 Host 追加:

ServerAliveInterval 60
ServerAliveCountMax 10

与上一种方法类似,这不过是客户端(本地终端)给服务端发送请求并保持连接。

如果你还没设置 SSH 连接,就在 SSH 文件夹 (.ssh) 下新建一个 config 文件,然后参考以下配置:

Host {shortcut of your server}
  HostName {ip of your server}
  User {the correspond user on your server that you wanna connect (root etc.)}
  ServerAliveInterval 60
  ServerAliveCountMax 10

然后使用 ssh {shortcut} .../ssh {ip} ... 即可连接,并发送保持请求。


以上记录的两种方法效果类似,只不过前者是服务端向客户端发送请求,后者是客户端向服务端发送请求。

至于选择,如果 VPS 仅仅是个人使用的话,可以考虑前者,这样无论在哪个客户端上都是最符合你的习惯。如果是多人合用,那就建议采用后者,这样不会对他人造成影响。

使 SSH 保持长时间连接
本文作者
ChrAlpha
发布日期
2020-01-27
更新日期
2020-01-27
转载或引用本文时请遵守 CC BY-NC-SA 4.0 许可协议,注明出处、不得用于商业用途!
CC BY-NC-SA 4.0