単純な 1 列のユーザー リストがあります。これは lastlog コマンドから取得されます。これらのアカウントが無効になっているかどうか、およびルート アクセスがないかどうかを確認する必要があります。more で表示して lastlog コマンドを実行することしかできません。過去 90 日間にログインしていないユーザーがまだアクティブかどうかを確認する必要があります。
これまでのところ私は実行している
sudo lastlog -b 90
これで、過去 90 日間にログインしたユーザーが表示されます。次に、awk を実行して最初のフィールドを印刷すると、単純なユーザー リストが完成します。次に、/etc/passwd で、シェルが /bin/bash かどうか、また、/etc/shadow で、!
行に があるかどうかを確認したいと思います。どうすればよいでしょうか。for ループと while ループを試しましたが、うまくいかないようです。どなたか助けていただければ幸いです。
答え1
あなたの言っていることがよく理解できているかわかりません。それがあなたの求めていることですか?
lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$"
内訳は次のとおりです。
awk '{if (NR > 1) print $1 }'
- 最初の行(lastlogのヘッダー)をスキップして最初の列を印刷しますgrep -f - /etc/passwd
- 標準入力をファイルとして使用してパターンを取得し、パターンを検索する/etc/passwd
grep "/bin/bash$"
- /bin/bash の grep は、$
を意味しますEOL
。
いくつかの注意事項:
lastlog -b 90
- 記録が残る年上の90 日未満。過去 90 日以内にログインしたユーザーを検索する場合は、 を使用しますlastlog -t 90
。(NR > 1)
とにかく使用するので、ソリューションを選択しましたawk
。ファイルの最初の行をスキップするより簡潔な方法は、 ですsed 1d
。
編集
/etc/shadowからのレコードもフィルタリングしたい場合も、同様のイディオムを使用できます!
。したがって、完全なコマンドは次のようになります。
lastlog -b 90 | awk '{if (NR > 1) print $1 }' | grep -f - /etc/passwd | grep "/bin/bash$" | cut -d ':' -f 1 | grep -f - /etc/shadow | grep -v ":\!:"
cut -d':' -f 1
区切り文字として行を分割し:
、最初のフィールドを返します。grep -v
手段反転一致(一致しない行を選択します)。
答え2
感嘆符は、お気づきのとおり「エスケープ」する必要があります。最初にバックスラッシュを付けて検索してみてください: ! ではなく \! と入力すると、テキストとして扱われるのではなく、コマンドのように実行されなくなります。また、多くの場合、次のように一重引用符 (二重引用符ではありません) で引用することもできます: '!' -- 選択したコマンドに応じて、これらのいずれかでエスケープできます。