![如何在特定时间从su-ed root注销](https://linux22.com/image/51581/%E5%A6%82%E4%BD%95%E5%9C%A8%E7%89%B9%E5%AE%9A%E6%97%B6%E9%97%B4%E4%BB%8Esu-ed%20root%E6%B3%A8%E9%94%80.png)
假设用户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 su
all 以 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