私は、非アクティブなユーザーIDを確認するためにetc_security_lastlogのデータを可視化する簡単な方法を探しています。 「非アクティブ」ユーザーは、time_last_loginが十分に古いかどうかによって決まります。どうすればいいですか?
lp:
time_last_unsuccessful_login = 1174162435
tty_last_unsuccessful_login = /dev/pts/7
host_last_unsuccessful_login = 1x.xxx.xxx.x.x
unsuccessful_login_count = 1
smtsftp:
unsuccessful_login_count = 3
time_last_login = 1382043613
tty_last_login = /dev/ssh-16842912
host_last_login = 1x.xxx.xxx.x.x.net.intra
time_last_unsuccessful_login = 1382083294
tty_last_unsuccessful_login = ssh
host_last_unsuccessful_login = 1x.xxx.xxx.x.x.net.intra
svcsinae:
unsuccessful_login_count = 0
privil1:
unsuccessful_login_count = 0
time_last_login = 1567112152
tty_last_login = /dev/pts/1
host_last_login = 11x.xxx.xxx.x.x
time_last_unsuccessful_login = 1507892677
tty_last_unsuccessful_login = ssh
host_last_unsuccessful_login = 1x.xxx.xxx.x.x
答え1
単純な awk フィルタを使用してこの問題を解決できます。現在のタイムスタンプと関心のある締め切りを渡すだけです。入力を解析して、ユーザー名と time_last_login 値を見つけます。期限より早い値が見つかった場合は、そのユーザーに報告します。
次の例では、おおよその1年(31,536,000秒)を使用しています。
awk -v now=$(date +%s) -v cutoff=31536000 '
/^[^-+@~ ][^:"#,=\\\/?` ]+:$/ {
user=$1
sub(/:$/, "", user)
}
/time_last_login = [[:digit:]]+/ {
if (now - $3 > cutoff) print user " has not logged in within the cutoff"
}
' /etc/security/lastlog
ユーザー名を検索するために使用する正規表現は、次のものに由来します。MKユーザー文書。ユーザー名(行)をキャプチャした後、ユーザー名から末尾のコロンを削除します。