/etc/passwd とユーザーのリストを照合する

/etc/passwd とユーザーのリストを照合する

単純な 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

感嘆符は、お気づきのとおり「エスケープ」する必要があります。最初にバックスラッシュを付けて検索してみてください: ! ではなく \! と入力すると、テキストとして扱われるのではなく、コマンドのように実行されなくなります。また、多くの場合、次のように一重引用符 (二重引用符ではありません) で引用することもできます: '!' -- 選択したコマンドに応じて、これらのいずれかでエスケープできます。

関連情報