如何在特定时间从su-ed root注销

如何在特定时间从su-ed root注销

假设用户su切换到root

$ su
Password: 
bash-4.2# crontab -l

如何root在某个时间注销所有此类用户?

我尝试过的

我知道,使用这个命令:

bash-4.2# ps -A -u root | grep bash
 2303 tty1     00:00:00 bash
 2548 pts/0    00:00:00 bash
 3040 pts/0    00:00:00 bash
 3080 pts/2    00:00:00 bash

我们可以获得 . 拥有的所有 Bash shell root。但我怎样才能选择由 生成的呢su?当我echo $$在 su-ed shell 中运行时,它给出了以下内容:

bash-4.2# echo $$
3040

然后我尝试:

bash-4.2# kill 3040

但它并没有杀死root外壳。另外,如果我创建一个cron job echo $$它不会给出必要的 PID。所以,这行不通。

现在我被困住了。

答案1

pkill -u 0 suall 以 root 身份运行的所有su进程(这又会杀死它们的子 shell)。

如果您只想终止在以下位置运行的 bash 进程su

for pid in $(pgrep -u 0 bash); do
  parent_pid=$(ps -o ppid= -p "$pid")
  parent_command=$(ps -o comm= -p "$parent")
  if [ "$parent_command" = "su" ]; then kill -HUP "$parent_pid"; fi
done

话虽如此,这可能是一个坏主意。如果你正在杀死的那个 shell 正在做一些重要的事情怎么办?

如果您想杀死长时间无人看管的 shell,请设置TMOUT中的变量.bashrc。例如,使用 时TMOUT=600,如果 bash 在 10 分钟内没有看到任何输入,它就会自动退出。

请仔细考虑您想要实现的目标。杀死 shell 很可能无法解决您想要解决的任何问题。

答案2

与其他国家一样,应该不需要它。您应该首先了解为什么有许多su进程处于活动状态。

另一方面,要终止所有这些进程,例如在 Linux 下,您可以使用:

ps aux | awk '/su( -)?$/ {print $2}' | xargs sudo kill

答案3

如果您不关心杀死其他su进程(su -u username),那么简单的方法是

   echo "killall su" | at 1145 jan 31

如果您关心,请使用 Emy 的解决方案,将其提供给“at”并持续“某个时间”,或者将其添加到 crontab 以进行定期调用。

请注意,聪明的用户将克服 Emy 的过滤器,su -u root并且追捕它们将很困难,因为su需要相当多的选项来欺骗正则表达式。killall更加万无一失,但可能会造成如上所述的附带损害。

答案4

为了终止属于 root 的所有 bash 进程,我使用了以下脚本:

for pid in $(pgrep -u 0 bash); do
    if [ "$pid" != "$$" ]; then
        kill -HUP "$pid";
    fi
done

相关内容