响应服务器端ClientAliveInterval
和的限制,客户端可以通过适当设置和值ClientAliveCountMax
来选择发送空数据包。ServerAliveInterval
ServerAliveCountMax
我如何才能确保只有交换了合法数据(即非空数据包)时会话才被视为有效?本质上,我如何让 SSH 服务器忽略来自客户端的所有空数据包?
如果客户端特意使用 top 或虚拟 shell 脚本编写循环来保持会话处于活动状态,那么这是一个不同的问题,因为这是保持会话打开的主动行为。我试图阻止当用户锁定屏幕或长时间离开时会话保持打开状态。
谢谢。
编辑:为了进一步说明,我必须补充一点,这里讨论的服务器是 SSH 跳转服务器,用户将不被允许在其上获取 TTY。因此,仅仅依靠 sshd_config 是不够的。
答案1
由于您感兴趣的是终端活动(缺乏),因此您应该在这个级别检查是否存在闲置情况。
幸运的是,bash 有一个内置的空闲函数,如果你将变量设置TMOUT
为秒数,并且过了该秒数后 shell 仍未执行任何操作,bash 就会退出。当 shell 在前台有命令时,则不会产生任何影响。
为了防止用户覆盖此设置,您可以将变量设为只读。
将所有这些放在一起,您将创建一个/etc/profile.d/tmout.sh
包含以下内容的文件:
TMOUT=900
readonly TMOUT
export TMOUT
如果 shell 空闲 15 分钟(900 秒),这将导致 shell 退出。将其设为只读意味着在同一 shell 会话中不能再次更改该变量。