检查同一用户是否打开了 2 个终端

时间:2021-07-19 17:29:54

标签: bash

我正在尝试检测 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;

3 个答案:

答案 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
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 中进行比较
xargs 用于将前一个参数传递给循环
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.confpam_limits 模块的配置文件。 在该文件中,您可以将 maxlogins 定义为用户的最大登录次数(此限制不适用于 uid=0 的用户)

https://www.man7.org/linux/man-pages/man5/limits.conf.5.html