我可以通过以下方式检查用户是否过期:
lsuser -f USERNAME | fgrep expires
但是如何检查用户的密码是否过期呢?还有其他“过期”的东西会带来麻烦吗? [这样用户就无法登录,因为他只能通过 FTP 访问服务器,并且他的密码已过期,并且他无法更改密码,因为他没有 SSH 访问权限来发出“passwd”命令来更新他的密码密码。]
答案1
chage
AIX 上有什么命令吗?检查 /etc/shadow 文件,该文件存储了到期信息。
更新:似乎有一个 passwdexpired 子例程可以加载并检查用户的密码以确定其是否已过期。不过,它似乎是作为 root 使用的。
此链接提供了有关您需要的内容的优秀文档
http://www.torontoaix.com/scripting/when_pwd_exp
正如上面文章前面所演示的,密码的过期时间由 maxage 属性控制。
For example:
maxage=0 means never to expire
maxage=2 means will expire in two weeks.
AIX 以纪元格式存储时间(以秒为单位),因此您首先必须确定一周有多少秒,因为这是 maxage 测量密码到期之间时间(以周数为单位)的方式。一天有 86400 秒,乘以 7 得到 604800。所以一周有 604800 秒。您需要查看的下一个命令是 pwdadm,它依次查询文件 /etc/security/passwd。该文件保存用户上次更改密码时的值(以秒为单位)。询问该文件或使用 pwdadm 命令将返回相同的结果。对于此演示,让我们查询用户 spoll:
# grep -p "spoll:" /etc/security/passwd
spoll:
password = EvqNjMMwJzXnc
lastupdate = 1274003127
flags = ADMCHG
# pwdadm -q spoll
spoll:
lastupdate = 1274003127
flags = ADMCHG
您可以从上面的输出中看到以秒为单位的上次更新值。也就是说最后一次修改密码的时间:1274003127
接下来,使用 lsuser 或使用 /etc/security/user 询问文件,您可以确定用户 spoll 密码过期之前的周数:
# grep -p "spoll:" /etc/security/user
spoll:
admin = false
maxage = 4
# lsuser -a maxage spoll
spoll maxage=4
从上面的输出中可以看到,密码到期前的周数为 4。接下来的任务是将一周中的秒数乘以用户 spoll 密码到期前的周数。在这种情况下,它是 4: 604800 * 4
# expr 604800 \* 4
2419200
接下来,您需要将 maxage 值(以秒为单位)(604800 * 4)添加到上次更改密码的时间:2419200 + 1274003127
# expr 2419200 + 1274003127
1276422327
现在,您可以将 UNIX 纪元中的秒数转换为更有意义的当前时间表示形式。您可以使用不同的工具,但在本演示中,您将使用 gawk 和 strftime 函数:
# gawk 'BEGIN {print strftime("%c",'1276422327')}'
Sun Jun 13 10:45:27 BST 2010
上述计算给出了下一次密码到期的时间。因此,您现在知道用户 spoll 的密码上次更改时间为(通过 pwdadm 命令):
# gawk 'BEGIN {print strftime("%c",'1274003127')}'
Sun May 16 10:45:27 BST 2010
并且它将在以下日期到期:
Sun Jun 13 10:45:27 BST 2010
------------------Perl script-let--------
#!/bin/perl
use POSIX qw(strftime);
$maxage=4;
$last_update = 1274003127
$max_week_seconds = 86400 * $maxage;
print strftime("%C ", localtime($max_week_seconds));
答案2
将其转换为正常时间(上次密码更新时间(以秒为单位)+最大使用时间(以秒为单位))
答案3
您可以通过系统管理界面工具( )来查找smit
。控制台版本是smitty
答案4
我编写了这个脚本来检查,希望这能帮助其他人:
#!/bin/sh
###############################################################################
# Script Name: aix_chk_user_expires.sh
#
# Author: Chris Alderson
#
# Purpose: Check when a user expires in AIX
#
# NOTES: Please change the value of $oozer to the id you desire to check against
#
##############################################################################
# Set value to specify a user
oozer='<username>'
#get epoch time for the time since last updated
time_since_last_update_in_epoch=$(lssec -f /etc/security/passwd -s $oozer -a lastupdate | cut -d= -f2)
#get the max age number of weeks from luser
max_age=$(lsuser -f $oozer | grep maxage | cut -d= -f2)
#multiply maxage by 7 to get number of days password will last
max_age_in_days=$(echo $((( max_age * 7 ))))
# multiply number of days by how many seconds in a day to get total seconds until change
# We will use this later to add to $time_since_last_update_in_epoch
max_age_in_epoch=$(echo $((( $max_age_in_days * 86400 ))) )
# Create new variable to store the total of max age in seconds and epoch of updated password
time_until_expires_in_epoch=$(echo $((( $max_age_in_epoch + $time_since_last_update_in_epoch ))))
#take epoch times and pass them to perl to give them a readible format
time_last_updated=$(perl -le 'print scalar localtime $ARGV[0]' ${time_since_last_update_in_epoch})
if [[ $max_age -eq 0 ]]; then
time_of_expiration=$(echo "non-expiring password")
else
##take epoch times and pass them to perl to give them a readible format
time_of_expiration=$(perl -le 'print scalar localtime $ARGV[0]' ${time_until_expires_in_epoch})
fi
echo "${oozer}'s password last updated: $time_last_updated"
echo "${oozer}'s password will expire: $time_of_expiration"
输出看起来像这样:
user's password last updated: Mon Jul 31 17:00:13 2017
user's password will expire: Mon Oct 23 17:00:13 2017