Возможно оба:
Если вы добавите флаг «-u» к дате в своем расчете, я думаю, он вернется и 21 июня.
Я заметил, что в 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 для новой учетной записи, я получаю 20.06.2015, как показывает passwd . Вот эпоха, преобразованная в значение даты для пользователя jedi:
[root@sci-fi ~]# date -d@"$(echo "$(awk -F ":" '/jedi/ ' /etc/shadow)*86400"|bc)" Sat Jun 20 20:00:00 EDT 2015
Итак, что правильно?
** Хотя правильный ответ уже был дан ниже. Я еще немного покопался и смог обоснованно доказать, что ответ правильный. Эта ссылка была очень полезна:
https://serverfault.com/questions/220633/calculate-days-since-1-1-1970
Я сделал тест, чтобы доказать это. Я установил новый пароль для учетной записи джедая. Текущие дни с начала эпохи 16823, как рассчитывается ниже
[root@sci-fi ~]# echo $(($(date --utc --date "$1" +%s)/86400)) 16823
Файл / etc / shadow согласен с этим (так что это факт):
[root@sci-fi ~]# awk -F ":" '/jedi/ ' /etc/shadow 16823
Инструмент strace показывает мне, что файл / etc / shadow доступен через chage. Да, несколько других файлов читаются по chage, но только в теневом файле есть дни, прошедшие с той эпохи, когда пароль последний раз устанавливался
[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 сообщает, что пароль был изменен в последний раз 23 января.
[root@sci-fi ~]# chage -l jedi | head -1 Last password change : Jan 23, 2016
Используя 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", ) = 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 янв. 23 17:59 / etc / localtime -> / usr / share / zoneinfo / America / New_York
[root @ sci-fi ~] # passwd -S джедай-джедай 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.)
Возможно оба:
Если вы добавите флаг «-u» к дате в своем расчете, я думаю, он вернется и 21 июня.