如何查詢一個盒子上的所有用戶并強制密碼過期?
目前,我正在查詢所有用戶:
getent shadow | awk -F: '$2 ~ /^\$/ || $2 ~ /^!\$/ {print $1} {print $3}'
這讓我得到了用戶名和最后一次密碼更改,但我只需要強制在passwd -e
2022 年 3 月 1 日之前未更改密碼的用戶 - 在 2022 年 3 月 1 日之后更改密碼的任何人我可以不理會那些(我相信這將是 19052 的值 - 所以任何大于或等于我可以跳過的值)。
uj5u.com熱心網友回復:
我這樣做了:
cut -d: -f1 /etc/passwd | { while IFS= read -r n; do echo -n "$n "; chage -li "$n" | awk 'NR==1{print $NF}'; done; echo CUTME 2022-03-01; } | sort -k2 | awk 'f{print} /CUTME/{f=1}'
如果你愿意,你可以xargs passwd -e
。
uj5u.com熱心網友回復:
我喜歡@KamilCuk 采用的方法。除此之外,我將包括一個最小UID
和最大UID
決議/etc/passwd
以排除系統帳戶。(注意:某些發行版以不同的值啟動第一個非系統 UID,通常是500
或者1000
- 檢查您的發行版)。最大值UID
可以排除位于范圍頂部的通用用戶帳戶,例如nobody
openSUSE 上的帳戶UID == 65534
要確定是否使密碼更改早于 2022 年 3 月 1 日的帳戶過期,可以很容易地將該日期和回傳的日期轉換chage
為 seconds-since-Epoch。這樣,您可以使用一個簡單的比較來比較上次密碼更改是否小于自 2022 年 3 月 1 日 Epoch 以來的秒數——使帳戶過期。
以下是您可以采取的一種方法將它們放在一起。xargs
是構建串列而不是逐個過期帳戶的另一種選擇。實際到期時間在下面注釋掉,而是列印將運行的命令stdout
以允許在帳戶實際到期之前進行測驗。
#!/bin/bash
## validate script is run with root privilege
[ $UID != 0 ] && [ $EUID != 0 ] && {
printf "error: script must be run as root, UID '%s' can't,\n" "$UID" >&2
exit 1
}
minUID=1000 ## first non-system UID
maxUID=65534 ## nobody
march1epoch=$(date -d "2022-03-01" %s) ## seconds since epoch
## pipe non-system users to while loop to check aging with chage
awk -v minU="$minUID" -v maxU="$maxUID" -F: '
$3 >= minU && $3 < maxU { print $1 }
' /etc/passwd |
{
## read each user name, get age since last pw change
while read -r usrnm; do
age=$(date -d "$(chage -l "$usrnm" |
awk -F: 'FNR==1 {print $NF; exit}')" %s)
## compare with march1epoch, expire all that are older
[ "$age" -lt "$march1epoch" ] && echo "passwd -e \"$usrnm\""
### uncomment line below to actually expire account
# [ "$age" -lt "$march1epoch" ] && passwd -e "$usrnm"
done
}
(注意:您可以使用Process Substitution在 bash中輸入while
回圈,而不是通過管道將結果傳遞給它 - 由您決定。如果您堅持使用 POSIX shell,那么管道將在兩種情況下都有效)
滿意后,取消注釋回圈中的最后一行,并可選擇洗掉僅輸出將要運行的命令的行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/453560.html