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编辑器排版混乱。