RHEL 6 中的“chage -l”和“passwd -S”为密码设置日期提供不同的值

RHEL 6 中的“chage -l”和“passwd -S”为密码设置日期提供不同的值

我注意到在 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

  1. 当通过 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
  1. 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
  1. 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
  1. “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

可能两者都有:

https://unix.stackexchange.com/questions/23193/etc-shadow-date-of-last-password-change-utc-or-local-time

如果您在计算中添加“-u”标志,我预计它也会返回 6 月 21 日。

相关内容