You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动