我注意到在 RHEL 6 中“chage -l USER”和“passwd -S USER”给出了不同的密码设置日期。我很好奇为什么。以下是我看到的内容:
[root@sci-fi ~]# chage -l jedi
Last password change : Jun 21, 2015
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7
[root@sci-fi ~]# passwd -S jedi
jedi PS 2015-06-20 0 99999 7 -1 (Password set, SHA512 crypt.)
当我将结果与新帐户的 /etc/shadow 中显示的内容进行匹配时,我得到了 6/20/2015密码显示。以下是将纪元转换为用户 jedi 的日期值:
[root@sci-fi ~]# date -d@"$(echo "$(awk -F ":" '/jedi/ {print $3}' /etc/shadow)*86400"|bc)"
Sat Jun 20 20:00:00 EDT 2015
那么,哪一个是正确的?
**虽然下面已经给出了正确答案。我做了更多的挖掘,并能够合理地证明答案是正确的。这个链接非常有用:
https://serverfault.com/questions/220633/calculate-days-since-1-1-1970
- 当通过 passwd 命令设置密码时,/etc/shadow 将使用 UTC 时间记录自纪元 (1/1/1970) 以来的天数
我做了一个测试来证明这一点。我在 jedi 账户上设置了一个新密码。当前自纪元以来的天数是 16823,计算如下
[root@sci-fi ~]# echo $(($(date --utc --date "$1" +%s)/86400))
16823
文件 /etc/shadow 同意这一点(因此这是事实):
[root@sci-fi ~]# awk -F ":" '/jedi/ {print $3}' /etc/shadow
16823
- chage 程序使用 /etc/shadow 文件中报告的最后一次密码更改来报告上次更改日期:
strace 工具显示文件 /etc/shadow 被 chage 访问。是的,chage 读取了其他几个文件,但只有 shadow 文件包含自上次设置密码以来的日期
[root@sci-fi ~]# strace chage -l jedi 2>&1 | grep etc
open("/etc/ld.so.cache", O_RDONLY) = 3
access("/etc/shadow", F_OK) = 0
open("/etc/passwd", O_RDONLY) = 4
open("/etc/shadow", O_RDONLY) = 5
open("/etc/localtime", O_RDONLY) = 6
因此,chage 程序报告密码最后一次更改是在 1 月 23 日,这并不奇怪。
[root@sci-fi ~]# chage -l jedi | head -1
Last password change : Jan 23, 2016
- passwd 命令略有不同,而且不太明确。
使用 strace,看起来 passwd 命令也从 /etc/shadow 中提取了最后的密码更改。
[root@sci-fi ~]# strace passwd -S jedi 2>&1 | grep etc
open("/etc/ld.so.cache", O_RDONLY) = 3
open("/etc/nsswitch.conf", O_RDONLY) = 4
read(4, "#\n# /etc/nsswitch.conf\n#\n# An ex"..., 4096) = 1688
open("/etc/ld.so.cache", O_RDONLY) = 4
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 4
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 4
open("/etc/libuser.conf", O_RDONLY) = 4
open("/etc/login.defs", O_RDONLY) = 4
open("/etc/default/useradd", O_RDONLY) = 4
stat("/etc/shadow", {st_mode=S_IFREG, st_size=1295, ...}) = 0
open("/etc/passwd", O_RDONLY) = 4
open("/etc/shadow", O_RDONLY) = 4
open("/etc/localtime", O_RDONLY) = 4
“passwd -S” 输出似乎报告了 /etc/shadow 中记录的与系统语言环境相关的上次密码更改时间。这是我的语言环境和“passwd -S”的输出:
[root@sci-fi ~]# ls -l /etc/localtime lrwxrwxrwx. 1 root root 36 1 月 23 日 17:59 /etc/localtime -> /usr/share/zoneinfo/America/New_York
[root@sci-fi ~]# passwd -S jedi jedi PS 2016-01-22 0 99999 7 -1 (密码设置,SHA512加密)
为了验证我的理论。我将时区改为伦敦(提前 5 小时):
[root@sci-fi ~]# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 33 Jan 24 00:33 /etc/localtime -> /usr/share/zoneinfo/Europe/London
[root@sci-fi ~]# passwd -S jedi
jedi PS 2016-01-23 0 99999 7 -1 (Password set, SHA512 crypt.)
“passwd -S”命令的输出现在与“chage -l”看到的内容相匹配。
如果我将时区改为山区标准时间 (MST),我将获得与使用 EST 时区相同的值:
[root@sci-fi ~]# ls -l /etc/localtime
lrwxrwxrwx. 1 root root 34 Jan 23 17:49 /etc/localtime -> /usr/share/zoneinfo/America/Denver
[root@sci-fi ~]# passwd -S jedi
jedi PS 2016-01-22 0 99999 7 -1 (Password set, SHA512 crypt.)
答案1
可能两者都有:
如果您在计算中添加“-u”标志,我预计它也会返回 6 月 21 日。