当所有 SSH 会话空闲超过一分钟时,关闭机器

当所有 SSH 会话空闲超过一分钟时,关闭机器

空闲是指没有前台程序运行,终端正在等待用户输入,但用户没有进行任何输入。

其实我的最终目标是:当所有SSH会话都空闲并且x-window也空闲时关闭。
的空闲时间x-window可以用 确定xprintidle。所以现在我只需要确定所有 SSH 会话是否空闲。
我在Linux中寻找了很多确定机器是否空闲的方法,但大多数都是基于x-window桌面是否空闲来确定的。

答案1

/etc/ssh/sshd_config

# default values
ClientAliveInterval                        0
ClientAliveCountMax                        3

如果您设置ClientAliveInterval为 600 {秒} 和ClientAliveCountMax0,那么这将关闭任何闲置 10 分钟的 SSH 会话。通过使用此机制,您可以进行任何 SSH 会话干净地在您选择的特定超时或空闲期后关闭。然后检查是否存在任何 SSH 会话或进程,如果没有则关闭。

建议您在使用这两个 SSH 参数之前先阅读它们以确保安全,

https://man.openbsd.org/sshd_config

sshd_config 中的选项 `ServerAliveInterval` 和 `ClientAliveInterval` 到底有什么作用?

因为有人不相信我...编辑/etc/ssh/sshd_config一下ClientAliveInterval 61ClientAliveCountMax 0然后让下面的脚本每分钟通过 crontab 运行一次,然后观察你的机器关闭

#!/bin/bash

# ssh_idle_shutdown.bash
# the first num (a) in file /var/run/sshidleshutdown.txt is 0 or 1 based on if a ssh connection has happened

# if a == 1 and count == 0 then do something

if [ ! -f /var/run/sshidleshutdown.txt ]
then
    echo 0 > /var/run/sshidleshutdown.txt
fi

count=`netstat -tnpa | grep 'ESTABLISHED.*sshd' | wc -l`

str=`head  /var/run/sshidleshutdown.txt`
astr=${str:0:1}
a=$((astr))

if [ $a -eq 0 ] && [ $count -gt 0 ]
then
   echo 1 > /var/run/sshidleshutdown.txt
elif [ $a -eq 1 ] && [ $count -eq 0 ]
then
   echo -n "ssh idle condition met system shutdown called at " >> /var/log/sshidleshutdownlog.txt
   date >> /var/log/sshidleshutdownlog.txt
   rm -f /var/run/sshidleshutdown.txt
#  execute /sbin/shutdown
fi

把这个放进去/etc/crontab

1 * * * * *  root   /path_to/ssh_idle_shutdown.bash

并且还做

chown root.root  /path_to/ssh_idle_shutdown.bash
chmod 700 /path_to/ssh_idle_shutdown.bash

这让 SSH 服务器识别哪些是空闲会话,然后 ssh 服务器将关闭它们。一旦我们看到至少一个已建立的 ssh 会话,我们就开始检查,直到通过 netstat 没有留下任何 ssh 会话,因为 ssh 服务器将根据 和 关闭空闲ClientAlive Interval会话。相应地调整运行频率。ClientAliveCountMaxsshd_configClientAliveInterval/etc/crontabssh_idle_shutdown.bash

相关内容