![如何使用 grep 检查哪些用户使用了 sudo?](https://linux22.com/image/140674/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20grep%20%E6%A3%80%E6%9F%A5%E5%93%AA%E4%BA%9B%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E4%BA%86%20sudo%EF%BC%9F.png)
拥有 root 权限:从/etc/passwd
具有 的文件行中选择/bin/bash
,获取用户名(字段 1),并从日志文件中查找/var/log/auth.log
他们是否使用了sudo
.我已经使用grep
和cut
来查找用户名,但我不知道如何检查他们是否使用了 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
表达式提取已使用过的用户的用户名sudo
,sort -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