文章

SSH客户端会话超时设置

SSH客户端会话超时设置

通常默认公有云上的ECS远程连接,很容易断开,当你有什么事情被打断或者去操作别的机器同步做点其他事情,你会发现你SSH客户端登录窗口经常会断开掉,非常烦人,经常要重新登录。

如果用一些Windows下客户端软件比如XShell or CRT都会有超时时间和心跳检测次数设置,但是默认Mac下的终端 Or Linux下直接远程命令客户端是没有这个设置窗口的。

1. Client端设置

万事先从本身先思考,如果能够先搞自己,就别搞别人,因为搞C你很容易负责,搞S搞坏了,那有时候就会很蛋疼,因为一般S会跑一些业务,C坏了,大不了一起从头再来,至少自做的饭在难吃,你也会咽下去,S坏了有可能你就要付出惨痛的代价, 所以先搞C端是比较Nice的选择。

SSH Client会从以下途径获取配置参数:

  1. SSH命令行参数;
  2. 用户配置文件 (~/.ssh/config);
  3. 系统配置文件 (/etc/ssh/ssh_config)。

姿势1

1
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=30 root@10.0.1.25 -p22

姿势2

1
2
3
4
$ vim ~/.ssh/config #添加如下内容
Host *
 ServerAliveInterval 60
 ServerAliveCountMax 30

姿势3

1
2
3
4
5
6
$ vim /etc/ssh/ssh_config # 在Host *下面添加:

Host *
       SendEnv LANG LC_*
       ServerAliveInterval 60
       ServerAliveCountMax 30

如果三个都设置了读取顺序是否是姿势1 —> 姿势2 —> 姿势3:

说明:

本地SSH Client每隔60s向Server端SSHD发送 keep-alive 包,如果发送30次, Server端还无回应则断开连接。

2. Server端设置

SSH Server在这里就是服务器端的sshd服务(类Unix的系统都有),可以通过修改sshd的配置文件来改变SSH Session的超时时间:

1
vim /etc/ssh/sshd_config

然后找到下面两项:

1
2
ClientAliveInterval 60
ClientAliveCountMax 30

这两项默认可能是注释掉的,去掉#,然后如上设置.

说明:

  • ClientAliveInterval: 这个其实就是SSH Server与Client的心跳超时时间,也就是说,当客户端没有指令过来,Server间隔ClientAliveInterval的时间(单位秒)会发一个空包到Client来维持心跳,60表示每分钟发送一次,然后客户端响应,这样就保持长连接了保证Session有效, 默认是0, 不发送;
  • ClientAliveCountMax:当心跳包发送失败时重试的次数,比如现在我们设置成了30,如果Server向Client连续发30次心跳包都失败了,就会断开这个session连接。

更多参考man ssh_config

3. SSH 免密登录权限问题

查看日志( /var/log/secure),报错: Authentication refused: bad ownership or modes for directory /root

解决:

  1. /root 目录权限修改为 700
  2. ~/.ssh 目录权限修改为 700
  3. ~/.ssh/authorized_keys 文件权限修改为 600

```sh chmod 700 /root chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys

本文由作者按照 CC BY 4.0 进行授权