0

我以前从未发布过,但我经常在这里搜索,你们通常都非常有帮助。

我遇到了用户密码过期的问题,并且由于我不定期检查 /var/cron/log,我从不知道这些用户即将过期,从而导致某些夜间作业无法运行。

使用此脚本,我希望能够检查这些特定用户的密码是否过期并向我们自己发送邮件提醒。

我在网上看到了很多例子,但是我有一个借用或编辑我看不懂的代码的事情,因为我想了解我在写什么,以及代码在做什么,可以帮助我更好地学习。

下面是我以一种我可以理解和使用的方式编写的一些代码,但它似乎不起作用,因为我仍然会收到一封电子邮件给每个管理员用户,说用户名将过期,即使我知道这不是真的。

有什么建议么?对不起,如果这很长

代码:

#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
4

2 回答 2

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
于 2013-01-25T17:29:59.300 回答
0

您收到每个管理员的电子邮件的原因是线路中存在问题:

Eval=`$MaxDay+$Epoch-$EpochSh`

这是试图将“Eval”变量转换为由变量 $MaxDay、$Epoch 和 $EpochSh 恰好是所形成的命令的结果。在我的情况下,结果证明99999+13937-1358541158这不是一个命令,因此 Eval 设置为 null 始终小于 7。因此始终发送有关密码在不到一周内到期的电子邮件。

这里有更多改进脚本的建议。如果这是一个 Linux 系统,那么从影子文件中解析记录是不正确的。“MaxDay”,即必须更改密码的天数,应从字段编号 4 而不是 5 开始设置。请注意,如果 MaxDay 为 99999 或 0,则密码不会过期。“Epoch”,表示上次更改密码的日期和时间,应取自字段编号 2 而不是 3。计算“Eval”变量的等式也应更改为:

eval Eval=`echo '( $MaxDay + $Epoch ) - ( $EpochSh / 86400 ) ' | bc`

这将返回密码过期的天数。

于 2013-01-18T21:11:26.527 回答