將使用者清單與 /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

您已經注意到,感嘆號需要「轉義」-試著先用反斜線輸入搜尋:\!代替 !因此它不會像命令一樣執行,而是被視為文字。在許多情況下,您也可以用單引號(而不是雙引號)引用它,如下所示: '!' -- 根據您選擇的命令,其中之一應該可以為您完成。

相關內容