如何在SSH无按键输入闲置X秒时自动关闭连接
如何在SSH无按键输入闲置X秒时自动关闭连接
嗨,这个需求根本不用折腾什么 wrapper 脚本,OpenSSH 本身就自带了现成的配置方案,而且分服务器端和客户端两种方式,你可以根据自己的权限情况来选:
1. 如果你有权限修改SSH服务器配置(推荐)
这是最直接有效的方式,通过服务器端的配置监控终端的闲置状态:
- 打开服务器上的
/etc/ssh/sshd_config配置文件 - 添加或修改以下参数(把
300改成你想要的闲置秒数,比如300就是5分钟):IdleTimeout 300 ClientAliveInterval 0 ClientAliveCountMax 0 - 保存文件后重启SSH服务,比如在systemd系统上执行:
sudo systemctl restart sshd,在SysVinit系统上执行:sudo service ssh restart
为什么这么设置?
IdleTimeout是专门用来检测用户终端是否有按键输入的参数,只要在指定时间内没有任何交互操作,就会自动断开SSH连接。而你用了tmux,完全不用担心进程丢失——SSH断开后,tmux的会话会在服务器后台继续运行,下次重新登录后执行tmux attach就能回到之前的操作环境,所有进程和数据都完好无损。
2. 如果你没有服务器配置权限(客户端侧方案)
如果只能控制自己的SSH客户端,虽然OpenSSH客户端没有直接检测终端闲置的参数,但可以结合终端的环境变量来实现:
- 打开你本地的
~/.ssh/config文件(没有的话就新建一个) - 添加针对目标服务器的配置:
Host your-server-alias HostName your-server-ip User your-username RequestTTY force RemoteCommand bash -c 'export TMOUT=300; exec bash' - 保存后,用
ssh your-server-alias登录服务器即可
原理说明
这里通过RemoteCommand在登录后自动给bash设置TMOUT环境变量(同样把300改成你要的闲置秒数),当bash在指定时间内没有任何输入时,会自动退出,进而触发SSH连接断开。因为你用tmux,只要在登录后先启动tmux,即使bash退出,tmux会话依然会保留,完全不影响后台进程。
不过这个方案有个小前提:服务器端允许RemoteCommand(默认是允许的,除非管理员特意禁用)。
备注:内容来源于stack exchange,提问作者S9oXavyF




