4

使 SSH 保持长时间连接

 2 years ago
source link: https://blog.ichr.me/post/keep-ssh-connection-alive-for-long/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK