我知道如果我输入,w
我就可以获得所有登录用户的列表。
我还知道这killall -u USERNAME
会踢出与用户相关的所有进程USERNAME
(包括 bash / 他们的 shell、他们的 sshd 进程等)。据我所知,这就是您应该如何“踢出”服务器的用户。
但是我不知道如何踢出所有用户。我是否必须以某种方式w | cut -d' ' -f1
获取用户列表(然后以某种方式删除空白行和 USER 字段以及您自己的用户名)并将其提供给 -u 命令killall
?
或者,还有更好的方法?
答案1
你可以用以下方法杀死他们:
who | awk '$1 !~ /root/{ cmd="/sbin/pkill -KILL -u " $1; system(cmd)}'
您需要是 root 身份或者使用 sudo。
请注意,杀死所有用户可能会很危险,并会损坏您的文件系统。此外,还会惹恼您的用户;当您杀死他们时,如果其中一个用户正在执行诸如 mysql 维护之类的操作,您期望会发生什么?
您确实应该使用ps -ef | grep "user"
或类似的东西来检查他们的流程。
为什么不警告他们呢?
shutdown -h +10 "Server is going down 10 minutes. Save your work and logout."
答案2
也写了这个脚本,它似乎有效:
#!/bin/bash
ME=$SUDO_USER
if [[ -z $ME ]]
then
echo "Must run script using sudo."
exit 1
fi
who | while read NAME REST
do
if [[ $NAME != $ME ]]
then
killall -u "${NAME}"
if [[ "$?" = "0" ]]
then
echo "Disconnecting ${NAME} from the system..."
else
echo "Could not disconnect ${NAME} from the system..."
fi
fi
done