下面的命令将为我提供不具有 1 天最短密码寿命的用户列表。这工作正常。
awk -F: '$4 < 1 {print $1}' /etc/shadow
我想拿着这个清单,然后运行......
chage -m 1 $p
其中 $p 是每行的用户名。
通常,我会将此列表保存为文件,然后对其运行 while 循环。请参阅下文,了解将所有用户更改为 1 天最短密码的完整命令。
mkdir ./tmp
awk -F: '$4 < 1 {print $1}' /etc/shadow > ./tmp/usernamelist
while read p; do
chage -m 1 $p
done <./tmp/usernamelist
rm -rf ./tmp/usernamelist
有没有一种方法可以逻辑地执行相同的操作,但无需保存文件?这是最佳实践吗?
我认为有一种方法可以使用管道命令来做到这一点,但我找不到正确的方法来构造它。
答案1
要么用管子
awk -F: '$4 < 1 {print $1}' /etc/shadow |
while read p; do
chage -m 1 "$p"
done
或通过流程替换
while read p; do
chage -m 1 "$p"
done < <(awk -F: '$4 < 1 {print $1}' /etc/shadow)
答案2
awk -F: '$4 < 1 {print $1}' /etc/shadow | xargs -r -L 1 chage -m 1
确保-L 1
awk 输出的每一行都传递到一个单独的查格调用,并-r
确保查格如果 awk 不输出任何内容,则不会执行 run (诚然,在这种情况下不太可能)。