问题描述

使用 SSH 指令进行远程连接,经常会遇到一个问题就是,操作了一会儿去做其他事情,返回 shell 时发现,SSH 会话已经过期了,只能重置或关闭当前 shell 之后重新连接。如果需要长时间保持会话,这种会话间断的情况就会很烦,服务器也会存在很多登录状态的 pts(伪终端)。

解决方法

网上找了几个方法,大致是修改 sshd 服务的配置:

  • 修改 server 端的 /etc/ssh/sshd_config
# 默认配置
#ClientAliveInterval 0
#ClientAliveCountMax 3
# 修改成
# server 每隔 60 秒发送一次请求给 client,然后 client 响应,从而保持连接
ClientAliveInterval 60
# server 发出请求后,客户端没有响应得次数达到 3,就自动断开连接,正常情况下,client 不会不响应
ClientAliveCountMax 3
  • 修改 client 端的 /etc/ssh/ssh_config
# client 每隔 60 秒发送一次请求给 server,然后 server 响应,从而保持连接
ServerAliveInterval 60
# client 发出请求后,服务器端没有响应得次数达到 3,就自动断开连接,正常情况下,server 不会不响应
ServerAliveCountMax 3

[notice]注意:修改的是客户端的配置/etc/ssh/ssh_config 服务器端也有这样的文件,但在服务器端修改并不起作用,只能在客户端(Linux 类型的)修改才行。[/notice]

对于非 Linux 系统,我使用 windows 下的 git-bash 工具进行连接远程服务器,git-bash 提供了 SSH 指令,shell 下是可以找到 /etc/ssh/ssh_config 文件的。Mac 可以使用 iTerms2 命令行工具,内部也提供了 SSH 指令,目录文件同样可以找到。

  • 修改 ssh 指令参数

这是一个临时的方法,每次连接时,将参数添加到指令中,就可以生效。

ssh -o ServerAliveInterval=60 admin@xx.xx.xx.xx

[notice]除了修改 ssh 指令参数是即时生效以外,其他的服务端或者客户端修改配置,都需要重新连接才能生效。服务端需要重启 sshd 服务,即 service sshd restart,之后再重新连接。[/notice]

这三个方法都可以使 ssh 会话时间不间断,除了第二个修改客户端的配置,我错误地去修改了服务端的 /etc/ssh/ssh_config 浪费了很多时间外,其他两个方法都测试有效。如果想要所有连接到服务器的请求都可以保持长会话,就修改服务器配置;如果希望客户端连接所有服务器的请求都可以保持长会话,就修改客户端配置;如果只是临时想要安装软件或其他的操作,需要保持长会话,可以用最后一个方法,在 ssh 指令中添加参数。

参考:ssh 设置超时时间