解决SSH自动断开无响应的问题

问题

终端连接远程 SSH 服务,经常会出现长时间无操作后就自动断开,或者无响应,无法再通过键盘输入,再过一会就自动断开了。特别烦的就是有时候 vim 在编辑一个文本,编辑到一半,还没保存,就卡住了。只能强行断开重连,重新编辑,如果直接再敲一次 vim,还会返回一个 Swap file ".xx.swp" already exists 错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
E325: ATTENTION
Found a swap file by the name ".ss.json.swp"
owned by: bingo dated: Thu Dec 14 02:03:25 2017
file name: ~bingo/Desktop/ss.json
modified: no
user name: bingo host name: bingo-mbp.com
process ID: 8542 (still running)
While opening file "ss.json"
dated: Tue Sep 26 02:12:57 2017
(1) Another program may be editing the same file. If this is the case,
be careful not to end up with two different instances of the same
file when making changes. Quit, or continue with caution.
(2) An edit session for this file crashed.
If this is the case, use ":recover" or "vim -r ss.json"
to recover the changes (see ":help recovery").
If you did this already, delete the swap file ".ss.json.swp"
to avoid this message.
Swap file ".ss.json.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
  • 要么先删了这个 .swp 文件,再 vim 进行编辑。
  • 要么就出现这个 ATTENTION 的时候,敲 E (Edit anyway),再继续编辑。

但仔细想一想,为什么要做这些没必要的操作?归根到底,就是因为断开了连接。那么问题来了,如何保持 SSH 连接不断开,或者断开连接后自动重连?

解决

方法一 客户端发送心跳

依赖 ssh 客户端定时发送心跳,putty、SecureCRT、XShell 都有这个功能,但是目测不太好用。

Linux / Unix 下,编辑 ssh 配置文件:

1
2
3
4
5
vim /etc/ssh/ssh_config
# 添加
ServerAliveInterval 20
ServerAliveCountMax 999
  • ServerAliveInterval表示每隔多少秒,从客户端向服务器端发送一次心跳(alive 检测)。
  • ServerAliveCountMax表示服务端多少次心跳无响应之后,客户端才会认为与服务器的 SSH 连接已经断开,然后断开连接。

上述配置则表示:每隔20秒,向服务器发出一次心跳。若超过999次请求都没有发送成功,则会主动断开与服务器端的连接。

方法二 服务器端发送心跳

方法一改在客户端,方法二改在服务器端。

1
2
3
4
5
sudo vim /etc/ssh/sshd_config
# 添加
ClientAliveInterval 60
ClientAliveCountMax 3
  • ClientAliveInterval表示每隔多少秒,从服务器端向客户端发送一次心跳。
  • ClientAliveInterval表示客户端多少次心跳无响应之后,服务端才会认为客户端已经断开连接,然后断开连接。

上述配置则表示:每隔60秒,服务器向客户端发出一次心跳。若客户端超过3次请求未响应,则会从服务器端断开与客户端的连接。所以,总共允许无响应的时间是 60 * 3 = 180 秒以内。

后话

至于使用方法一还是方法二,看情况吧,本质上没什么区别。

  • 如果只想满足自己的需求,就在自己电脑上使用方法一。
  • 如果作为运维,想照顾可能会连上服务器的用户们,就再在自己服务器上使用方法二。

上述配置后,我做了个简单测试。连接美国洛杉矶的搬瓦工vps,ssh 连上后,不做任何操作,目前已经维持连接3天整,没有任何问题。中间还经历了几次短时间断网(几十秒),也都自动恢复了。

  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/61.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!