我想知道如何在 AIX 服务器上生成所有帐户密码上次更新期限的列表。
我对查找用户帐户感到非常困惑,因为服务器没有 /etc/shadow 文件。我尝试使用
pwdadm -q user01
,但它输出编码的时间戳,并且不知道如何解码它。
预期结果:
user1 - 60 days
user2 - 30 days
lastupdate 属性以通常的“自纪元以来的秒数”格式输出,这在大多数系统(不是全部!!!)中意味着,该数字是自 1970 年 1 月 1 日以来经过的秒数。一些罕见的系统具有不同的纪元零次,但通常这是有效的。
要获取当前值(“NOW”),请尝试
date +%s
并将从 pwdadm 收到的数字转换为可读日期,例如使用date --date='@1242483347'
要获取当前 pwd 的年龄(以秒为单位),只需计算 NOW(见上文)与 pwdadm 显示的时间戳之间的差异即可。
这是我的解决方法:
#!/bin/ksh93
for user in $(lsuser -R files -a id ALL | awk '{ print $1 }')
do
lastupdate=$(lsuser -C -a lastupdate "$user" | awk -F: 'NR == 2 { print $2 }')
if [ -z "$lastupdate" ]
then
# no timestamp to process
continue
fi
# pwage=$(perl -MTime::Seconds -e 'my $val = Time::Seconds->new(time() - shift); print $val->pretty;' "$lastupdate")
pwage=$(perl -MTime::Seconds -e 'my $val = Time::Seconds->new(time() - shift); print int($val->days);' "$lastupdate")
printf '%s - %s\n' "$user" "$pwage days"
done
此 shell 脚本循环本地用户(仅提取他们的用户名)并尝试提取 lastupdate 属性。如果该属性存在,我们使用一个简短的内联 Perl 脚本,通过
time()
包的 shift
将年龄(
Time::Seconds
是当前时间,days()
获取最后更新值)转换为天数。方法。或者,注释掉,您可以使用同一包的 pretty()
方法,该方法将以扩展格式打印年龄: user1 - 168 days, 6 hours, 22 minutes, 24 seconds
;如果是这样,请调整后面的 printf
以省略“天”位。