标签:
struct spwd { char *sp_namp; /* user login name */ char *sp_pwdp; /* encrypted password */ long int sp_lstchg; /* last password change */ long int sp_min; /* days until change allowed. */ long int sp_max; /* days before change required */ long int sp_warn; /* days warning for expiration */ long int sp_inact; /* days before account inactive */ long int sp_expire; /* date when account expires */ unsigned long int sp_flag; /* reserved for future use */ }
通过查看shadow的手册,可以看到上面的代码解释,分别对应/etc/shadow 中的各项参数
mail:*:15513:0:99999:7:::
参数一: sp_namp 用户名称
参数二: sp_pwdp 用户加密后的密码
参数三: sp_lstchg 用户密码最近一次修改时间,算法是今天的时间减去jan,1,1970得到的时间间隔
参数四: sp_min 用户最少多少天后才能改密码的天数(默认为0,表示可以在任何时间修改,有啥意义?有种需求叫密码永不变= =。)
参数五: sp_max 用户最多多少天后一定要修改密码的天数,系统会强制用户修改密码(默认为99999,改为1 也能让密码改不了)
参数六: sp_warn 过期前多少天时间会被警告(改为-1 则永远不会提示)
参数七: sp_inact 过期后多少天内账号变为inactive状态,可登陆,但不能操作
参数八: sp_expire 多少天后账号会过期,无法登陆
参数九: sp_flag 保留参数
————————————————————————————————————————————————————————
根据上述功能,我考虑了个需求
查看当前所有用户什么时候过期的,用日期的表示方法表示出来
首先实现这个功能手动去加减实在没必要,linux有个date命令自带了个转换功能(实在是人性化,修改days为sec 可以得到相加秒的结果)
[root ]# date -d "1970-01-01 15776 days" +%Y/%m/%d 2013/03/12
然后,就简单啦~~写个脚本转换下,一个awk可以搞定
#! /bin/bash # FILE=/etc/shadow echo -e "NAME\tMUST-CHANGE\tEXPIRE" awk -F ‘:‘ ‘{ if ($2 != "*" && $2 != "!!" ) { NAME=$1; MAX_CH=$3+$5; EXPIRE=$3+$8; CMD="echo -e "NAME" \"\t\`date -d \"1970-01-01 "MAX_CH" days\" +%Y/%m\` \t\`date -d \"1970-01-01 "EXPIRE" days\" +%Y/%m\`\" " system(CMD); } }‘ $FILE 2>/dev/null
标签:
原文地址:http://www.cnblogs.com/linquan/p/5013625.html