我之前从未发过帖子,但我经常在这里搜索,而且你们通常都非常乐于助人。
我遇到了用户密码过期的问题,因为我不检查/ var / cron / log on regular我从来不知道这些用户是否过期,使某些夜间作业无法运行。
使用此脚本,我希望能够检查这些特定用户的密码是否过期,并给自己发送提醒。
我在网上看到了大量的例子,但我有一些借鉴或编辑我无法理解的代码,因为我想了解我在写什么,以及代码在做什么,这有助于我更好地学习。
下面是我编写的一些我可以理解和使用的方式的代码,但它似乎没有工作,因为我仍然收到每个管理员用户的电子邮件,说用户名将过期,即使我知道这不是真的。
有什么建议吗?对不起,如果这是冗长的
代码:
#Author:Emmanuel Iroanya Jr
#Edited:
#Date:December 20th, 2012
#Purpose: The purpose of this is to check the Shadow table for the epoch value and warn the users / Email of Password Expiration seven days in advance
ID=`id | cut -d ' ' -f 1`
if [[ "${ID}" != "uid=0(root)" ]]
then
echo "You Need To Be Root To Run This Script, Please and Thank You"
exit 1
fi
export Shadow=/etc/shadow
EpochSh=`perl -e 'print time, "\n"'`
export Hostname=`hostname`
#Our SSE Email Address that will get notification
export Email="emmanuel@mycompany.com"
for line in `cat $Shadow | grep adm`
do
echo $line
done >passFile.txt
for i in `cat passFile.txt`
do
User=`echo $i |cut -d ':' -f 1`
MaxDay=`echo $i | cut -d ':' -f 5`
echo "$MaxDay"
Epoch=`echo $i |cut -d ':' -f 3`
Eval=`$MaxDay+$Epoch-$EpochSh`
echo "$Eval"
if [[ $Eval -lt 7 ]]
then
echo "Password for unix user $User on `hostname` is going to expire in less than a week. Please change it ASAP" | mailx -s 'Password Expiration ' $Email
elif [[ $Eval -le 0 ]]
then
echo "PASSWORD FOR USER $User HAS EXPIRED.PLEASE CHANGE IT ASAP TO AVOID PRODUCTION CRON JOBS FROM FAILING AND THE RESULTING LATE NIGHT CALLS" | mailx -s 'Password Expiration ' $Email
fi
done
答案 0 :(得分:0)
您收到每个管理员的电子邮件的原因是该行存在问题:
Eval=`$MaxDay+$Epoch-$EpochSh`
那就是尝试将'Eval'变量转换为由$ MaxDay,$ Epoch和$ EpochSh变形所形成的命令的结果。在我的情况下,结果是99999+13937-1358541158
这不是命令,因此Eval被设置为null,总是小于7.因此,关于密码在不到一周内到期的电子邮件总是发送。< / p>
以下是更多改进脚本的建议。如果这是一个Linux系统,那么从影子文件解析记录是不正确的。 “MaxDay”,即必须更改密码的天数,应该从字段编号4而不是5设置。请注意,如果MaxDay为99999或0,则密码不会过期。表示上次更改密码的日期和时间的“Epoch”应取自字段编号2而不是3.计算“Eval”变量的等式也应改为:
eval Eval=`echo '( $MaxDay + $Epoch ) - ( $EpochSh / 86400 ) ' | bc`
这将返回密码过期的天数。
答案 1 :(得分:0)
@ZaSter感谢您的帮助,我最终将表达式拆分,请参阅下面的完整代码:
#!/bin/ksh -x
#Author:Emmanuel Iroanya Jr
#Date:December 20th, 2012
#Purpose: The purpose of this is to check the Shadow table for the epoch value and warn the users / Email of Password Expiration seven days in advance
ID=`id | cut -d ' ' -f 1`
if [[ "${ID}" != "uid=0(root)" ]]
then
echo "You Need To Be Root To Run This Script, Please and Thank You"
exit 1
fi
export Shadow=/etc/shadow
export EpochSh=`perl -e 'print time, "\n"'`
export Hostname=`hostname`
#Our SSE Email Address that will get notification
export Email="mygroup@mycompany.com"
for line in `cat $Shadow | grep adm`
do
echo $line
done >passFile.txt
for i in `cat passFile.txt`
do
User=`echo $i |cut -d ':' -f 1`
MaxDay=`echo $i | cut -d ':' -f 5`
echo "$MaxDay"
Epoch=`echo $i |cut -d ':' -f 3`
echo "$Epoch"
Eval1=`expr $MaxDay + $Epoch`
Eval2=`expr $EpochSh / 86400`
Eval=`expr $Eval1 - $Eval2`
#export Eval=$(echo '( $MaxDay + $Epoch ) - ( $EpochSh / 86400 ) ' | bc)
echo "$Eval"
if [[ $Eval -lt 7 ]]
then
echo "Password for unix user $User on `hostname` is going to expire in less than a week. Please change it ASAP" | mailx -s 'Password Expiration ' $Email
elif [[ $Eval -le 0 ]]
then
echo "PASSWORD FOR USER $User HAS EXPIRED.PLEASE CHANGE IT ASAP TO AVOID PRODUCTION CRON JOBS FROM FAILING AND THE RESULTING LATE NIGHT CALLS" | mailx -s 'Password Expiration ' $Email
fi
done
但是,我的上一个也是最后一个问题是如何处理如下所示的用户名,其中使用passwd -x -1将密码设置为永不过期。所以MaxDay变量是空白的,这是导致它们全部报警的原因,它得到一个空白值传递它,数字显然会低于7或0并导致电子邮件
示例:
+ + cut -d : -f 1
+ echo testingadm:.ezNz7T6WZLK.:15730::::::
User=newadm
+ + cut -d : -f 5
+ echo testingadm:.ezNz7T6WZLK.:15730::::::
MaxDay=
+ echo
+ + cut -d : -f 3
+ echo testingadm:.ezNz7T6WZLK.:15730::::::
Epoch=15730
+ echo 15730
15730
+ + expr + 15730
expr: syntax error
Eval1=
+ + expr 1359133813 / 86400
Eval2=15730
+ + expr - 15730
expr: syntax error
Eval=
+ echo
+ [[ -lt 7 ]]
+ mailx -s Password Expiration mygroup@mycompany.com
+ hostname
+ echo Password for unix user newadm on cmap01 is going to expire in less than a week. Please change it ASAP