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`

これは、変数 $MaxDay、$Epoch、および $EpochSh がたまたま何であれ、'Eval' 変数をコマンドの結果にしようとしています。私の場合、それはコマンドではないことが判明した99999+13937-1358541158ため、Eval は常に 7 未満である null に設定されました。したがって、1 週間以内に期限切れになるパスワードに関する電子メールが常に送信されます。

スクリプトを改善するためのその他の提案を次に示します。これが Linux システムの場合、シャドウ ファイルからのレコードの解析は正しくありません。パスワードの変更が必要になるまでの日数である "MaxDay" は、フィールド番号 5 ではなく 4 から設定する必要があります。MaxDay が 99999 または 0 の場合、パスワードは期限切れにならないことに注意してください。パスワードが最後に変更された日時を表す「エポック」は、3 ではなくフィールド番号 2 から取得する必要があります。「Eval」変数を計算するための式も次のように変更する必要があります。

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

これにより、パスワードの有効期限が切れるまでの日数が返されます。

于 2013-01-18T21:11:26.527 に答える