使 SSH 保持长时间连接
众所周知,为了保护服务器及其拥有者利益,在使用 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 仅仅是个人使用的话,可以考虑前者,这样无论在哪个客户端上都是最符合你的习惯。如果是多人合用,那就建议采用后者,这样不会对他人造成影响。