我正在尝试检测 1 个用户是否打开了 2 个终端会话。 如何实现?
我尝试的是以下内容:
linuxName="$(id -u -n)"
for user in "$@"; do
if echo "$who" | grep -q "$linuxName"; then
echo "[WARNING] You're already logged in";
closeSessionIfNotRoot
fi;
done;
答案 0 :(得分:0)
#!/usr/bin/bash
linuxName="$(id -un)"
for user in "$@"; do
process_counter=$(pgrep -u "$user" bash 2>&1 | wc -l)
if [[ "$user" == $(who | grep -o "$linuxName") ]]; then
echo "[WARNING] You're already logged in $user"
if [[ "$process_counter" -gt 1 ]]; then
((process_counter--))
pgrep -u "$user" bash | tail -"$process_counter" |
xargs -I % kill -9 %
echo "closed other terminals: $user"
fi
fi
done
script
+arguments
[在这种情况下,users_names],例如,./script alex zara sophia
process_counter=$(pgrep -u "$user" bash 2>&1 | wc -l)
2>1
将输出错误重定向到 NO SHOW。以防您编写了系统中不存在的用户名。pgrep -u $user bash | wc -l
返回打开的终端数量。 u $user
用于返回该用户的进程,因此是这个 uniq。pgrep
显示您正在搜索的进程,例如,pgreg bash
返回进程 ID 列表返回:
363570
369836
370113
$user
--> ./file alex zara
与终端 $linuxName
[[ "$user" == $(who | grep -o "$linuxName") ]]
grep -o
只返回用户名 alex
而不是 alex :1 2021-07....
[[ ]]
是在 bash 中进行比较tail -"$process_counter" | xargs -I % kill -9 %
tail -$process_counter
用于显示最后打开的终端363570
369836 #return only this
370113 #return only this
请记住,我们 REST 减 1 到 process_counter 因为我们想让 1 个终端保持打开状态,这是通过 ((process_counter--))
完成的。
所以 3 个终端打开 - 1 个终端 = 2 个终端关闭。
现在我们用 XARGS 循环
363570
369836 #CLOSE THIS kill -9 369836
370113 #CLOSE THIS kill -9 370113
-I
参数告诉 xargs 分配一个变量,用符号 %
表示。但是这个符号可以是任何东西,比如 #,$,
然后我们想要做的是杀死每个进程,所以这就是为什么 kill -9 %
答案 1 :(得分:0)
对超过 2 个的计数进行排序和过滤。
id -u -n | sort | uniq -c | awk '$1 > 2'
答案 2 :(得分:-1)
检查 limits.conf
是 pam_limits
模块的配置文件。
在该文件中,您可以将 maxlogins
定义为用户的最大登录次数(此限制不适用于 uid=0 的用户)
见https://www.man7.org/linux/man-pages/man5/limits.conf.5.html。