尝试在多个用户的影子文件中找到密码更改的最后一天。我可以在特定用户(user.name)上执行此操作,但如果影子文件有多个用户,我会有点卡住。我不关心服务帐户或任何其他用户(只有拥有user.name的人,例如bob.smith,sally.brown等)。如果我使用通配符,则脚本会爆炸。我正在测试虚拟shadow.test文件(如下所示)。任何帮助表示赞赏。
#!/bin/bash
secs_per_day=86400
last_password_change=$(echo $(( $(grep user.name shadow.test |cut -d: -f3) *
$secs_per_day )))
date -d@$last_password_change
答案 0 :(得分:1)
你快到了。让我们用您编写的代码创建一个shell函数:
getchangetime() {
local secs_per_day=86400
local last_password_change=$(echo $(( $(egrep "${1}" /etc/shadow |cut -d: -f3) * $secs_per_day )))
date -d@$last_password_change
}
然后使用for循环为您关心的所有用户运行它。
for user in $(cut -d: -f1 /etc/passwd| egrep '[a-zA-Z0-9]\.[a-zA-Z0-9]')
do
echo -n "$user: "
getchangetime $user
done
我确信这可以清理一下(使用bash参数操作而不是切割,可能还有其他一些调整)但我认为它会做你想做的事。
答案 1 :(得分:1)
试试这个:
password_change_dates () {
secs_per_day=8400
while IFS=: read user last ; do
let last=last*secs_per_day
printf '%s %s\n' "$user" "$(date -d@$last)"
done < <(cut -d: -f1,3 "$1" )
}
# user names and password change dates
password_change_dates shadow.test
# just the dates
password_change_dates shadow.test | cut -d' ' -f2-
# just the users
password_change_dates shadow.test | cut -d' ' -f1
答案 2 :(得分:1)
是否有理由没有使用“passwd -S”命令?
我把这个选项放在Shadow中是有原因的。你们不妨使用它:)
这是更简单的方法 -
passwd -S ${USER} | cut -d' ' -f3
我不知道当前的维护者(Shadow是否超过21,我把它扔出家里......)已经添加了支持,所以其他数据库将支持 -S 选项,但是我希望如此。