我有这三个命令来获取用户数量、锁定的用户帐户数量、解锁的用户帐户数量、设置为永不过期的密码数量。
cut -d: -f1 /etc/passwd|wc -l
cat /etc/passwd | cut -d : -f 1 | awk '{ system("passwd -S " $0) }'|wc -l
awk -F: '{ system("passwd -S " $1)}' /etc/passwd | grep " PS "|wc -l
cut -f 1 -d: /etc/passwd | xargs -n 1 -I {} bash -c ' echo -n {}" "; chage -l {} | fgrep "Password expires"' | column -t|wc -l
有没有一种方法可以让我向其添加 echo 命令和/或使用一个命令来获取所有这些信息并获取设置为过期的帐户信息? echo "用户数=xx",锁定的用户数=xx,密码永不过期的用户数=xx,设置过期的用户数?
谢谢
答案1
您可以很容易地将这三个中的两个(用户计数和锁定帐户计数)与awk
ed结合起来passwd -Sa
,但是您必须循环起来chage
才能显示过期的密码。
passwd -Sa | awk 'BEGIN {lockedusers=0} $2 ~ /L/ {lockedusers++} END {print "Total users:",NF;print "Locked users:",lockedusers}'
neuser=0
for user in $(cut -f1 -d: /etc/passwd); do
if chage -l "$user" | grep -i '^Password expires' | grep -q never; then
neuser=$((neuser+1))
fi
done
echo "Non-expiring users: $neuser"
如果您的实现passwd
缺乏-a
(例如 Red Hat 派生的发行版),您可以使用类似的for
循环:
neuser=0
for user in $(cut -f1 -d: /etc/passwd); do
if chage -l "$user" | grep -i '^Password expires' | grep -q never; then
neuser=$((neuser+1))
fi
passwd -S "$user"
done | awk 'BEGIN {lockedusers=0} $2 ~ /L/ {lockedusers++} END {print "Total users:",NF;print "Locked users:",lockedusers}'
echo "Non-expiring users: $neuser"
答案2
下面的脚本将返回已过期以及将在未来 7 天内过期的用户列表。
cat /etc/shadow | cut -d: -f1,8 | sed /:$/d > /tmp/expirelist.txt
totalaccounts=`cat /tmp/expirelist.txt | wc -l`
for((i=1; i<=$totalaccounts; i++ ))
do
tuserval=`head -n $i /tmp/expirelist.txt | tail -n 1`
username=`echo $tuserval | cut -f1 -d:`
userexp=`echo $tuserval | cut -f2 -d:`
userexpireinseconds=$(( $userexp * 86400 ))
todaystime=`date +%s`
#check if the user expired or not?
if [ $userexpireinseconds -ge $todaystime ] ;
then
timeto7days=$(( $todaystime + 604800 ))
if [ $userexpireinseconds -le $timeto7days ];
then
echo "The user account $username going to expired in next 7 days"
fi
else
echo "The user account $username already expired"
fi
done