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