我有一个简单的单列用户列表。它来自 lastlog 命令。我需要能够判断这些帐户是否被禁用并且我没有 root 访问权限。我只能使用 more 查看并执行 lastlog 命令。我需要查看过去 90 天内未登录的用户是否仍处于活动状态。
到目前为止我执行
sudo lastlog -b 90
它为我提供了过去 90 天内登录的用户。现在我只需通过 awk 运行它,打印第一个字段,这就是我的简单用户列表。现在我想看看在 /etc/passwd 中,他们的 shell 是否是 /bin/bash,如果在 /etc/shadow 中,!
他们的行中是否有。我该怎么做。我尝试了 for 循环和 while 循环,但似乎做不到?任何帮助都将不胜感激。
答案1
我不确定我是否理解正确。这就是你想要的吗?
lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$"
具体细节如下:
awk '{if (NR > 1) print $1 }'
- 打印第一列,跳过第一行(lastlog 的标题)grep -f - /etc/passwd
- 使用标准输入作为文件来获取模式并在其中搜索模式/etc/passwd
grep "/bin/bash$"
- grep /bin/bash ,$
意思是EOL
。
几点说明:
lastlog -b 90
- 为您提供记录较旧超过 90 天。如果您想要过去 90 天内登录的用户,请使用lastlog -t 90
。- 我只选择了
(NR > 1)
解决方案,因为无论如何我们都在使用awk
。跳过文件第一行的更简洁的方法是sed 1d
。
编辑
如果您还想过滤掉!
/etc/shadow 中的记录,则可以使用类似的习惯用法。因此,完整的命令将是:
lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$" | cut -d ':' -f 1 | grep -f - /etc/shadow | grep -v ":\!:"
cut -d':' -f 1
使用分隔符分割行:
并返回第一个字段grep -v
方法反转匹配(选择不匹配的行)。
答案2
您注意到,感叹号需要“转义”——请先尝试使用反斜杠输入搜索:\! 而不是 !,这样它就不会像命令一样执行,而是被视为文本。在许多情况下,您还可以用单引号(而不是双引号)将其括起来,如下所示:'!'——根据您选择的命令,其中一个应该可以为您完成。