web-dev-qa-db-ja.com

inotifywaitでファイルを監視して変更を取得する方法

/ etc/shadowでパスワードが変更されるたびにユーザー名を取得したい。これが私のスクリプトです:

while inotifywait -e attrib /etc/shadow; do
                 #edit user
                        while IFS=: read -r f1 f2
                           #get username for changed password
                        done < $file
         #end edit user
done

どうすれば簡単にできますか?

2
Fatima Zohra

最後のパスワード変更を表示するには、passwdを使用します

passwd -S | awk '{print $3}'

または別のユーザー名用

Sudo passwd -S user_name | awk '{print $3}'

したがって、スクリプトの/etc/passwdのユーザー名をループして、各ユーザーのタイムスタンプを表示できます。IDが1000以上のユーザーの場合があります。

while inotifywait -e attrib /etc/shadow; do
    awk -F: '($3 >= 1000) {print $1}' /etc/passwd | xargs -I{} passwd -S {} | awk '{print $1,$3}'
done

どの項目が正確に変更されたかを判断するには、awk …の出力を保存し、次の開始と比較する必要があります。


% passwd -S | awk '{print $3}'
07/14/2015

% passwd
Changing password for aboettger.
(current) UNIX password: 
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully

% passwd -S | awk '{print $3}'
10/01/2015

または具体的なユーザーアカウント用

% Sudo passwd -S root | awk '{print $3}'
05/29/2015

またはすべてのユーザー向け

% awk -F: '($3 >= 1000) {print $1}' /etc/passwd | xargs -I{} passwd -S {} | awk '{print $1,$3}'
passwd: You may not view or modify password information for nobody.
aboettger 10/01/2015
2
A.B.