在具有 Ansible 2.9.27 和 Python 2.7.5 的 RHEL 7.9 环境中,我想了解一下
- 本地 root 帐户的密码有多长(以天为单位)?
- 自上次更改密码以来已经过了多少天?
由此可以通过以下方式获取最后一次密码更改的日期
sudo chage -l root
Last password change : Jan 01, 1970
...
- 如何在 Ansible 中计算上次更改日期和今天之间的差异?
答案1
RHEL 应该有一个可用的getent
,因此您可以从那里获取密码期限数据。这是第三个字段,是从 1970 年开始的天数。今天的天数可以从纪元以来的当前时间(以秒为单位)除以 86400 并截断后找到。 (好吧,也许可以给出或去掉你的时区偏移量。我不确定影子工具是否根据当地的时区,或根据 UTC。)
# user=ilkkachu
# age=$(( $(date +%s) / 86400 - $(getent -- shadow "$user" |cut -d: -f3) ))
# printf "age of user %s's password is %d days\n" "$user" "$age"
age of user ilkkachu's password is 1444 days
不过,您可能需要成为 root 才能getent
获取所需的信息。 (对于 中的数据来说确实如此/etc/shadow
,但如果数据位于例如 LDAP 中,则可能取决于配置。)
当然,允许某人getent
以 root 身份运行(例如通过 sudo)也将允许他们看到密码哈希,这是他们不需要的,而且这不仅仅是chage -l
让他们知道。为了防止这种情况发生,或者至少让它变得更难,您可以创建一个运行该脚本的脚本getent | cut
管道的脚本,并且只允许它们运行那。
答案2
经过一些研究,我发现两者之间的区别当前时间(以秒为单位)和自日期以来的秒数可以按照下面所示的方式减去。之后只需要通过除法将秒变成天即可。
- name: Gather root password age in days
shell:
cmd: echo $(( ($(date +%s) - $(date +%s -d "$(chage -l root | head -1 | cut -d ':' -f 2)")) / 86400 ))
check_mode: false
changed_when: false
failed_when: false
register: result
- name: Show result
debug:
msg: "{{ result.stdout | int }}"
谢谢
进一步的步骤
如果涉及到 LDAP 中的非本地帐户,则需要做更多的工作。