将用户列表与 /etc/passwd 进行匹配

将用户列表与 /etc/passwd 进行匹配

我有一个简单的单列用户列表。它来自 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

您注意到,感叹号需要“转义”——请先尝试使用反斜杠输入搜索:\! 而不是 !,这样它就不会像命令一样执行,而是被视为文本。在许多情况下,您还可以用单引号(而不是双引号)将其括起来,如下所示:'!'——根据您选择的命令,其中一个应该可以为您完成。

相关内容