查找最后一天在影子文件中更改的密码

时间:2012-03-22 11:54:39

标签: bash

尝试在多个用户的影子文件中找到密码更改的最后一天。我可以在特定用户(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

3 个答案:

答案 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 选项,但是我希望如此。