我应该编写一个脚本来输出本地用户的真实姓名及其密码过期信息。
这就是我现在所拥有的。任何帮助,将不胜感激。
$ cat /etc/passwd | grep '/home' | cut -d: -f5 ;chage -l {} | \
fgrep "Password expires"'| column -t
答案1
获取本地用户的更好方法可能是查看用户是否具有有效的登录 shell:
getent passwd | grep -f /etc/shells
这是应该起作用的东西:
getent passwd | grep -f /etc/shells | tr ',' ':' | \
awk -F: '{print $1, $5}' | while read USER NAME
do
echo $NAME:$(chage -l $USER| awk -F': ' '/Password expires/{print $2}')
done | column -ts:
使用xargs
,可以执行以下操作:
getent passwd | grep -f /etc/shells | tr ',' ':' | awk -F: '{print $1, $5}' | \
xargs -L1 bash -c 'echo ${@:2}:$(chage -l $1| awk -F": " "/Password expires/{print \$2}")' : | \
column -ts:
- 使用
tr
替换为,
让:
我们可以直接从 GECOS 字段中提取全名。 column
可以使用 给定一个输入分隔符-s
,这使我们可以将多单词名称保留在一列中。-L
使用xargs
一个线每个命令的输入,以便将用户名和全名传递给每个命令。${@:2}
- 从第二个参数开始的所有参数(跳过第一个)。
输出示例:
root never
Murukesh Mohanan never
Guest never
答案2
您可以使用xargs
如下方式迭代结果:
$ grep '/home' /etc/passwd | cut -d: -f1 | xargs -n1 -I{} chage -l {} | \
grep "Password expires" | column -t
Password expires : never
在此变体中,我们使用switchxargs
进行调用-n1
,因此它只会chage -l
使用单个用户名参数进行调用。告诉-I{}
我们xargs
用作{}
宏,以便我们可以在调用时标记我们希望它放置参数的位置chage
。
答案3
cut -d: -f1,3,5 /etc/passwd | while IFS=: read -r user userid fullname
do
if [ "$userid" -gt 500 ];
then
echo "Full Name: $fullname"
echo "Password Expiry date: $(chage -l "$user" | head -2 | tail -1)"
fi
done
我只是添加了检查本地用户的额外步骤,因为/etc/passwd
文件通常也包含我们不想要的系统用户。另外,我使用while
循环来迭代文件以获得更好的可读性。