過去15日間にログインしていないユーザーを識別するスクリプトを作成します。

過去15日間にログインしていないユーザーを識別するスクリプトを作成します。

質問があります:

運動は次のとおりです

過去 15 日間ログインしておらず、「alumnos」グループに属するユーザーを検索するスクリプトを作成します。リストは/var/log/alumnos_sin_loginに追加されます。

私のアプローチ:

    #2)
#!/bin/bash
#Scripts which detects users whose group is "alumnos" who have been not logged in,
#in the last 15 days. The users' list is added to /var/log/alumnos_sin_login
#RESULTADO holds those users who haven't entered in the last 15 days
#LISTA holds alumnos' users' list
#USUAEIO actual user being parsed
#RAIZ != "" if user has logged -15 days

#Read and check if group is not created
exec 0 </etc/gshadow
if [ $(grep "alumnos:") -e ]
then
    echo "Grupo alumnos no existe"
    exit 1
fi


RESULTADO="Los alumnos que llevan más de 15 días sin loguearse son: "
LISTA=$(grep "alumnos:" | cut -d ':' -f 4)
IFS=,
for USUARIO in $LISTA
do
    RAIZ=$(find /home/$USUARIO -atime +15 | grep "/home/$USUARIO")
    if [ $RAIZ != "" ]
    then
        RESULTADO="$RESULTADO $USUARIO"
    fi
done

echo $RESULTADO >> /var/log/alumnos_sin_login
exit 0

Q:この文をどのように改善できますか?

if [ $(grep "alumnos:") -e ]

グループが作成されたことを確認してください。存在しない場合は正常に機能しますが、存在する場合は次のように報告します。

bash: [: ==: unary operator was expected

なぜ?

次に、ユーザーが過去15日間にログインしていないことを知るためのより良い方法はありますか?コードは、そのディレクトリが/home/name_of_userであり、標準ではないと仮定しているためです。私は、最後のユーザーのログイン時間を取得するコマンドがあるのか​​、それとも少なくとも自分のディレクトリを正しく知る方法があるのか​​わからないからです。

ご協力ありがとうございます。

ベストアンサー1

過去15日間にログインしていないユーザーのリストを取得する最も簡単な方法は、/home次のlastlogコマンドを使用することです。

lastlog -b 15 

出力行を表示します。

alumno1 pts/14 172.17.1.114 2016年10月22日 土曜日 22:18:57 +0100

名前(最初のフィールド)のみを希望する場合:

lastlog -b 15 | sed "1d" | awk ' { print $1 } '

(ヘッダーをsed "1d"削除するために使用される場合lastlog

~から男の最後の記録:

オプション lastlog コマンドで使用できるオプションは次のとおりです。

   -b, --before DAYS
       Print only lastlog records older than DAYS.

ユーザーがログインしたことがない場合は、ポートと時刻の代わりに「ログインしていません」というメッセージが表示されます。

グループを検証する実際のスクリプトは次のとおりです。

#!/bin/bash 

getent group alumnos > /dev/null
if [ $? -ne 0 ]
then
    echo "group alumnos does not exist"
    exit 1
fi

for i in ` lastlog -b 15 | sed "1d" | awk ' { print $1 } '`
do
    if [ `id -ng $i` == "alumnos" ]
    then
        echo $i
    fi
done
exit 0

ここで、
変数は、現在の繰り返し「$i」が指すユーザーグループの名前が与えられたら、指定されたiすべてのユーザーの名前を繰り返し、グループが存在することを確認します。lastlog
id -ng user
getent group alumnos

if言及したエラーは、何も見つからないとオペランドがgrep欠落して空になります。トリックの1つは、次のように文字列比較を「x」で埋めることです。

if [ "x"$i == "xstring" ]
then
   ...

グループ同窓会があることを確認する別のオプション:

if [ $(grep "^alumnos:" /etc/group) -e ]
then
    echo "No group alumnos"
    exit 1
fi

複数のグループのユーザーを確認する別のオプション:

groups user | grep alumnos

おすすめ記事