ClientAliveInterval 没有关闭空闲连接

ClientAliveInterval is not closing the idle connection

我的任务是关闭空闲的 ssh 连接,如果它们空闲超过 5 分钟。我尝试在 sshd_config

上设置这些值
TCPKeepAlive no
ClientAliveInterval 300
ClientAliveCountMax 0

但似乎没有任何效果,空闲状态仍然有效,即使空闲时间超过 5 分钟也不会丢失。

然后我发现了这个https://bbs.archlinux.org/viewtopic.php?id=254707他们说

These are not for user-idle circumstances, they are - as that man page excerpt notes - for unresponsive SSH clients. The client will be unresponsive if the client program has frozen or the connection has been broken. The client should not be unresponsive simply because the human user has stepped away from the keyboard: the ssh client will still receive packets sent from the server.

我什至不能使用 TMOUT 因为有 ssh 客户端脚本不 运行 bash 程序。

如何实现?

Openssh版本 OpenSSH_8.2p1 Ubuntu-4ubuntu0.4,OpenSSL 1.1.1f 2020 年 3 月 31 日

close the idle ssh connection if they are idle for more than 5 minutes

这个任务出奇的难。 OpenSSH 本身没有在 shell 命令 上设置 idle-timeout 的功能,可能有一个很好的理由:杀死“空闲” shells 本身就是 non-trivial:

  • 多种方式来定义“空闲”,例如,没有标准输入,没有标准输出,没有 I/O activity,没有 CPU消费等
  • 即使进程被视为“空闲”,也很难终止进程 及其所有可能已创建的 child 进程

鉴于此,一般只有很少的解决空闲 shell 会话的解决方案也就不足为奇了。我可以通过(少量)研究找到的那些依赖于后台守护进程,这些后台守护进程检查系统上 所有 进程 运行 的空闲状态(例如,doinkd/idled, idleout)。

一个可能的解决方案是检查是否可以调整这些解决方案中的任何一个以在特定shell 会话上强制执行空闲超时。

另一种选择是调整 OpenSSH 源代码 以支持您的特定要求。原则上,OpenSSH 应该能够轻松访问控制台 I/O activity 和会话持续时间,因此评估“空闲”属性 可能相对容易。至于“杀死”shell 和所有涉及的 children,运行(并杀死)PID namespace 中的远程 shell 是 PID namespace 上的有效选项 Linux系统。

这两个选项都相对复杂——所以在进一步研究它们之前,我会进一步检查是否存在现有解决方案来在 shell 会话 上强制执行空闲超时.在 OpenSSH 下使用它们将非常简单。