如何使用 grep 检查哪些用户使用了 sudo?

如何使用 grep 检查哪些用户使用了 sudo?

拥有 root 权限:从/etc/passwd具有 的文件行中选择/bin/bash,获取用户名(字段 1),并从日志文件中查找/var/log/auth.log他们是否使用了sudo.我已经使用grepcut来查找用户名,但我不知道如何检查他们是否使用了 sudo。如何使用grep用户名和 sudo?或者也许我需要使用另一个命令?

答案1

从另一个方向看:获取最近使用过的所有用户并列出使用其登录 shellsudo的用户:bash

sed -nE 's/.*[0-9] ([^ ]+) sudo:.*/\1/p' </var/log/auth.log | sort -u |
while read user; do
    getent passwd "$user" |
    awk -F ':' '$NF == "/bin/bash" { print $1 }'
done

sed表达式提取已使用过的用户的用户名sudosort -u对它们进行排序并删除重复项,然后循环测试这些剩余用户是否已/bin/bash设置为他们的登录 shell。如果有,则打印用户名。

auth.log如果文件确实很大并且您不想为每个bash用户解析一次,则按此顺序执行此操作是有意义的。相反,我们getent为日志文件中的每个用户运行一次。但我们可以改进这一点...

在提议的顺序中:

getent passwd |
awk -F ':' '$NF == "/bin/bash" { printf("s/.*[0-9] (%s) sudo:.*/\\1/p\n", $1) }' |
sed -nE -f - /var/log/auth.log | sort -u

在这里,awk脚本创建了一个sed脚本。在我的 Ubuntu 测试机上,这个脚本看起来像

s/.*[0-9] (root) sudo:.*/\1/p
s/.*[0-9] (ubuntu) sudo:.*/\1/p
s/.*[0-9] (myself) sudo:.*/\1/p
s/.*[0-9] (otheruser) sudo:.*/\1/p

sed然后针对日志文件运行此脚本auth.log,并输出bash最近使用过的用户的名称sudo。对结果进行排序并删除重复项。

在这里,我们不会多次解析日志文件,而且我们不需要多次调用getent.

答案2

/etc/passwd这将使用 shell循环遍历每个用户 in /bin/bash,然后grep对于用户 in /var/log/auth.log,然后使用awk检查第五个字段是否为“sudo:”,第六个字段是否是用户的名称,sort然后uniq用于返回列表使用过的用户(也有insudo的 shell :/bin/bash/etc/passwd

for user in $(awk -F: '$7 == "/bin/bash"{print $1}' /etc/passwd);do 
  grep "$user" /var/log/auth.log|\
  awk -v user="$user" '$5 == "sudo:" && $6 == user {print user}'
done | sort | uniq

相关内容