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 保留参数

————————————————————————————————————————————————————————

根据上述功能,我考虑了个需求

1. 查看当前所有用户什么时候过期的,用日期的表示方法表示出来

首先实现这个功能手动去加减实在没必要,linux有个date命令自带了个转换功能(实在是人性化,修改days为sec 可以得到相加秒的结果)

[root    ]#  date -d "1970-01-01 15776 days" +%Y/%m/%d
2013/03/12

然后,就简单啦~~写个脚本转换下,一个awk可以搞定

再为了看的整齐点

#! /bin/bash
#
FILE=/etc/shadow 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 |sort -k 3 | awk '{printf("%-15s%-15s%-15s\n",$1,$2,$3)}'

2.根据密码安全规则考虑,除了root用户 所有用户应该要3个月必须改一下密码并设置下时间提醒

这个需求涉及到如何修改已有用户的各项属性

先来了解个命令

[root@Bridge ~]# chage --help
Usage: chage [options] [LOGIN] Options:
-d, --lastday LAST_DAY set date of last password change to LAST_DAY
-E, --expiredate EXPIRE_DATE set account expiration date to EXPIRE_DATE
-h, --help display this help message and exit
-I, --inactive INACTIVE set password inactive after expiration
to INACTIVE
-l, --list show account aging information
-m, --mindays MIN_DAYS set minimum number of days before password
change to MIN_DAYS
-M, --maxdays MAX_DAYS set maximim number of days before password
change to MAX_DAYS
-W, --warndays WARN_DAYS set expiration warning days to WARN_DAYS

新建一个测试账号   testlinjq:*****:16772:0:99999:7:::

根据需求chage –M   6     testlinjq ,令该“testlinjq”用户第七天就要改密码,测试下warning参数是否会提醒

testlinjq:*******:16772:0:6:7:::
Warning: your password will expire in 6 days
Last login: Thu Dec 3 14:57:50 2015 from 10.0.0.120

确实生效了,那么本次修改的账号属性应该有3个。

1. 用户上一次修改时间,改为今天,即从今天起后3个月要改密码,对应命令chage –d 16772

2. 用户最大超时时间,90天  chage –M 89,(有强迫症的同学可以给改成90,测试了确实是从0开始计数)

3. 用户密码超时提醒开启,方便起见,我给设置成99,相当于永远提醒,只要比MAX的值大就行 chage –W 99

最终形成如下脚本

#! /bin/bash
#
FILE=/etc/shadow
OUTPUT=/tmp/expire-time function PRINTUSERS {
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/%d\` \t`date -d \"1970-01-01 "EXPIRE" days\" +%Y/%m/%d\`\" "
system(CMD);
}
}' $FILE 2>/dev/null |sort -k 3 | awk '{printf("%-15s%-15s%-15s\n",$1,$2,$3)}' 1> $OUTPUT
cat $OUTPUT
} function UPDATAUSERS {
let TODAY=`date +%s`/86400
while read LINE ;do
NAME=`echo $LINE | cut -d ' ' -f 1`
if [ $NAME == "root" ];then
continue;
fi
chage -d $TODAY -M 89 -W 99 $NAME
done < $OUTPUT
} case $1 in
"--PRINT")
PRINTUSERS
;;
"--UPDATA")
UPDATAUSERS
;;
*)
echo "command is [--PRINT|--UPDATA] "
;;
esac

linux /etc/shadow文件详解的更多相关文章

  1. 【转】linux中inittab文件详解

    原文网址:http://www.2cto.com/os/201108/98426.html linux中inittab文件详解 init的进程号是1(ps -aux | less),从这一点就能看出, ...

  2. Linux /etc/profile文件详解

    Linux /etc/profile文件详解   转载地址:http://linux.chinaitlab.com/administer/820910.html linux /etc/profile文 ...

  3. Linux下inittab文件详解

    /etc/inittab文件详解 Linux系统的启动过程为:加电自检-->根据BIOS中的设置从指定的设备启动-->找到设备MBR中的bootloader引导启动系统-->启动ke ...

  4. linux 系统中 /etc/passwd 和 /etc/shadow文件详解

    链接地址:http://blog.csdn.net/yaofeino1/article/details/54616440

  5. linux中inittab文件详解

    init的进程号是1(ps -aux | less),从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序. init程序需要读取配置文件/etc/ ...

  6. Linux中profile文件详解(转)

    1.Linux是一个多用户的操作系统.每个用户登录系统后,都会有一个专用的运行环境.通常每个用户默认的环境都是相同的,这个默认环境实际上就是一组环境变量的定义.用户可以对自己的运行环境进行定制,其方法 ...

  7. Linux /etc/password 文件详解

    root2:x:0:0::/home/root2:/bin/bash[用户名]:[密码]:[UID]:[GID]:[身份描述]:[主目录]:[登录shell] 其中: ⒈[用户名]是passwd文件里 ...

  8. 转:linux的fatab文件详解

    /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改. 当系统启 ...

  9. linux之fstab文件详解

    /etc/fstab是用来存放文件系统的静态信息的文件.位于/etc/目录下,可以用命令less /etc/fstab 来查看,如果要修改的话,则用命令 vi /etc/fstab 来修改. 当系统启 ...

随机推荐

  1. MySQL中使用replace into语句批量更新表数据

    作为示例,我们在这里使用名为testdb的数据库,并且在其中创建两张一模一样的表: drop table if exists test_table_1; create table test_table ...

  2. LSTM改善RNN梯度弥散和梯度爆炸问题

    我们给定一个三个时间的RNN单元,如下: 我们假设最左端的输入  为给定值, 且神经元中没有激活函数(便于分析), 则前向过程如下: 在  时刻, 损失函数为  ,那么如果我们要训练RNN时, 实际上 ...

  3. 物联网防火墙himqtt源码之MQTT协议分析

    物联网防火墙himqtt源码之MQTT协议分析 himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWall,C语言编写,采用epoll模式支持数十万 ...

  4. VS2010开发.cpp与.c的注意事项

    VS2010开发.cpp与.c的注意事项 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 强大的VS2010,正是由于vs2010的完全封装,让现在的wind ...

  5. es6 装饰器decorator的使用 +webpack4.0配置

    decorator 装饰器 许多面向对象都有decorator(装饰器)函数,比如python中也可以用decorator函数来强化代码,decorator相当于一个高阶函数,接收一个函数,返回一个被 ...

  6. AMD, CMD, CommonJS和UMD

    我的Github(https://github.com/tonyzheng1990/tonyzheng1990.github.io/issues),欢迎star 今天由于项目中引入的echarts的文 ...

  7. mysql 记录 - concat、concat_ws、group_concat 的用法

    本文中使用的例子均在下面的数据库表tt2下执行: 一.concat()函数 1.功能:将多个字符串连接成一个字符串. 2.语法:concat(str1, str2,...) 返回结果为连接参数产生的字 ...

  8. 日常工作问题解决:Redhat6.5--解决yum无法正常安装配置问题

    1.问题描述 解决RedHat6.5下yum功能不能用问题: 在redhat6.5下使用yum安装时,会提示:This system is not registered to Red Hat Subs ...

  9. 逆转单向链表看这一篇就够了【JAVA】

    逆转单向链表 逆转前: 1 -> 2 -> 3 -> 4 -> 5 -> null 逆转后: 5 -> 4 -> 3 -> 2 -> 1 -> ...

  10. wordpress 图片上传时发生了错误,请稍后再试 的解决办法

    前一天网站还是好好的,仅一天过后就显示图片无法上传,百思不得其解 上下百度,大多数帖子提供的解决办法对我都不适用,继续搜,最后发现一篇帖子中提到是wp-config的编码格式问题 想到昨天刚好修改了下 ...