我正在努力弄清楚如何实现这一点,因为它不支持-a
CentOS/RHEL 上的参数。
我的问题是:我将通过passwd -S <user>
每个用户名获取所有字段,并根据原始脚本解析输出。如何修改脚本?
#!/bin/bash
passwd -Sa | while read LOGIN PASS_TYPE LAST_CHANGE MIN_AGE MAX_AGE WARN_DAYS INACTIVE_DAYS; do
# Is this account disabled?
[[ $PASS_TYPE == LK ]] && DIS="disabled" || DIS=""
# Can this account sudo?
#sudo -l -U "$LOGIN" | grep -q not\ allowed && CAN_SUDO="" || CAN_SUDO="sudo"
sudo -l -U "$LOGIN" | grep -q "(ALL) NOPASSWD: ALL\|(ALL) ALL" && CAN_SUDO="sudo" || CAN_SUDO=""
# Grab misc. info from passwd entry
IFS=: read _ PASS USERID GROUPID FULLNAME HOMEDIR SH < <(getent passwd "$LOGIN")
# Grab login time of the latest entry in the lastlog output
LATEST="$(last ${LOGIN} | head -1 | cut -c40-)"
echo "${LOGIN}|${FULLNAME}|${USERID}|${LAST_CHANGE}|${MIN_AGE}|${MAX_AGE}|${WARN_DAYS}|${INACTIVE_DAYS}|${DIS}|${CAN_SUDO}|${LATEST}"
done
答案1
RHEL 变体passwd
支持该-S
选项,但您必须一次使用一个用户名。
因此,从用户列表开始/etc/passwd
,然后passwd
依次对所有用户使用该命令。
#!/bin/bash
for user in $(cut -d: -f1 /etc/passwd); do
read -r LOGIN PASS_TYPE LAST_CHANGE MIN_AGE MAX_AGE WARN_DAYS INACTIVE_DAYS CRYPT < <(passwd -S $user)
# Rest of the processing
done
请注意,我添加了一个名为 CRYPT 的附加变量来捕获行末尾的加密信息。如果没有它,INACTIVE_DAYS 变量就不会获得数值。