我正在寻找一种有效的方法来终止空闲登录会话(控制台、ssh 等)。互联网上有大量关于如何做到这一点的答案,但它们都只涵盖非常基本的用例。
要求是:
- 该设置必须应用于所有登录会话(登录会话被定义为 pam 会话)。
- 它不能被用户覆盖。
- 愚弄一定很困难/不可能。不幸的是,这是一个主观要求。如果用户将一只正在喝水的鸟放在键盘上,那么就不值得防范。但是,如果他们可以在 ssh 客户端配置或 shell 配置文件中设置一个设置来有效地消除超时,那么就应该防止这种情况发生。
- 活动定义为 SSH 流上的任何 IO(加密之前)。尽管最坏的情况它可以被定义为 TTY/STDIN/STDOUT/STDERR 上的 IO。前者是首选,因为 ssh 隧道之类的东西应该保持其活动状态。但如果超时(小时)足够高,后者是可以接受的。
不起作用的解决方案:
Cron作业解析w
/who
输出:
这不起作用,因为并非所有会话都会显示在此列表中。例如,您可以执行ssh foo.example.com bash
,该会话将不会显示在列表中。您也可以执行ssh -N foo.example.com
或后台ControlMaster
进程,但不会显示。
使用& :sshd_config
ClientAliveInterval
ClientAliveCountMax
这是我经常看到的另一个建议,但它不起作用,因为杀死空闲连接根本不是它的本意。这些设置旨在检测和终止死连接,而不是空闲连接。通过在客户端
进行设置很容易绕过这些设置。ServerAliveInterval
外壳TMOUT
变量
这是一个非常弱的解决方案,因为它需要 shell,并且很容易被用户覆盖。