一行命令解决ssh连接自动断开问题

IT开发、运维、调试等工作经常需要ssh登录远程服务器。现在很多ssh server端设置了空闲超时自动断开。例如,人离开大于30分钟无操作,服务器判断空闲时间超过,于是断开连接,其实这很不利于开发调试工作的连续性。用户往往没有服务端配置权限。此外,客户端xshell,putty等的”保持活动状态“功能企图解决这个问题,但不一定能生效。例如,国内使用堡垒机登录的情况越来越普遍,访问一台内部服务器实际都经过了堡垒机的转发,堡垒机判断空闲超时,从而导致ssh”保活“措施对内部服务器不起作用。

这里给出一个通用的解决办法。ssh登录之后,在bash shell环境执行。

while true;do \
  for x in $(ls -1 /dev/pts |grep "^[0-9]");do \
    echo -en "\x07" > /dev/pts/$x;\
  done;\
  sleep 1777;\
done &

查看ssh登录情况,

$ who
root     tty1         2021-01-07 14:38
root     pts/0        2022-01-07 17:55 (192.168.1.3)
root     pts/5        2022-01-07 07:28 (192.168.1.3)
root     pts/6        2022-01-07 17:57 (192.168.1.3)
root     pts/7        2022-01-07 18:26 (192.168.1.3)

其中pts/0,pts/5,pts/6,pts/7都是ssh登录终端设备。

说明:

1. 若要ssh session保持活跃,只要在规定时间间隔内接收到的字节数不为零,则该session不会被服务端认为空闲。

2. 向pts设备随意发送数据会影响ssh终端窗口的显示,例如在一个窗口用wall命令发消息而用户正在其他终端窗口vim编辑文档,在编辑区域会出现广播过来的消息,对用户工作造成一定干扰。为避免该问题,向pts设备发送BEL(振铃),该字符没有任何回显,也就不会把显示搞乱。

3. 设置发送间隔小于服务端设定的空闲间隔。例如,服务端设置半小时自动断开,那么我们设置1777秒是足够的。

4. 如果同时用了expect自动登录,登录之后一般不要改变终端窗口大小,因为expect缺省忽略SIGWINCH信号,窗口size变化导致VIM编辑器排版混乱。


版权声明:本文为wanghuiict原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。