root権限があります。/etc/passwd
を含むファイル行から選択し、ユーザー名(フィールド1)を取得し、使用されている場合は/bin/bash
ログファイルで検索します。を使用してユーザー名を見つけましたが、確認方法がわかりません。彼らはsudoとして使用されます。ユーザー名とsudoの使い方は?それとも別のコマンドを使用する必要がありますか?/var/log/auth.log
sudo
grep
cut
grep
答え1
別の方向から見ると、最近のユーザーをすべてインポートし、ログインシェルが使用されているsudo
ユーザーを一覧表示します。bash
sed -nE 's/.*[0-9] ([^ ]+) sudo:.*/\1/p' </var/log/auth.log | sort -u |
while read user; do
getent passwd "$user" |
awk -F ':' '$NF == "/bin/bash" { print $1 }'
done
このsed
式は、すでに使用されているユーザーのユーザー名を抽出し、sudo
それらsort -u
をソートして重複を削除し、ループを介して残りのユーザーがログインシェルに設定されて/bin/bash
いるかどうかをテストします。存在する場合は、ユーザー名を印刷します。
auth.log
ファイルが本当に大きく、各ユーザーに対して一度だけ解析したくない場合は、bash
この順序で実行することをお勧めします。代わりに、getent
ログファイルの各ユーザーに対して1回実行します。しかし、私たちはこれを改善することができます...
提案された順序で:
getent passwd |
awk -F ':' '$NF == "/bin/bash" { printf("s/.*[0-9] (%s) sudo:.*/\\1/p\n", $1) }' |
sed -nE -f - /var/log/auth.log | sort -u
ここでawk
スクリプトはsed
スクリプトを生成します。私のUbuntuテストシステムでは、このスクリプトは次のようになります。
s/.*[0-9] (root) sudo:.*/\1/p
s/.*[0-9] (ubuntu) sudo:.*/\1/p
s/.*[0-9] (myself) sudo:.*/\1/p
s/.*[0-9] (otheruser) sudo:.*/\1/p
sed
その後、このスクリプトはログファイルに対して実行され、最近使用したユーザーの名前をauth.log
印刷します。結果を並べ替え、重複項目を削除します。bash
sudo
ここではログファイルを何度も解析せず、何度も呼び出す必要はありませんgetent
。
答え2
/etc/passwd
これはシェルを使用してin各ユーザーを繰り返し、/bin/bash
ingrep
ユーザーに対してループを実行し、/var/log/auth.log
5番目のフィールドが「sudo:」で、6番目のフィールドが次を使用するawk
ユーザー名であることを確認します(次にシェルがあります。sort
uniq
sudo
/bin/bash
/etc/passwd
for user in $(awk -F: '$7 == "/bin/bash"{print $1}' /etc/passwd);do
grep "$user" /var/log/auth.log|\
awk -v user="$user" '$5 == "sudo:" && $6 == user {print user}'
done | sort | uniq