ログインしていないユーザーを探すコマンド

ログインしていないユーザーを探すコマンド

システムにログインしていないユーザー数を確認するコマンドはありますか?

ログインしているユーザー数とログインしていないユーザー数を数えるシェルスクリプトを作成しようとしています。

ベストアンサー1

ユーザーグループのリスト

次のコマンドを使用して、すべてのローカルユーザーのリストを取得できます。

$ getent passwd | awk -F: '{print $1}'

メモ: getentローカルユーザーが存在せずsssd(または同様のサービスを実行してLDAPユーザーを取得し)、権限がファイルに制限されていると仮定して/etc/nsswitch.confローカルユーザーを返します。つまり、NIS や NIS+ などの項目は含まれません。純粋なローカルユーザーの場合awk -F: '{print $1}' /etc/passwd

現在ログインしているユーザーのリスト:

$ who

現在ログインしていないユーザーのリスト:

$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}')

最後のエントリは、ログインしたユーザーのリストを取得し、ログインしたユーザーを除くすべてのユーザーのリストを表示するために使用されますgrep -vf

カウントを受ける

数を取得するには、wc -lコマンドの最後に追加します。

ログインしていません
$ grep -Fxvf <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}') | wc -l
53
ログイン
$ who | awk '{print $1}' | sort -u | wc -l
1

grep フラグ

-F, --fixed-strings
        Interpret PATTERN as a list of fixed strings, separated by newlines, 
        any of which is to be matched.

-x, --line-regexp
        Select only those matches that exactly match the whole line.

-v, --invert-match
        Invert the sense of matching, to select non-matching lines.

-f FILE, --file=FILE
        Obtain patterns from FILE, one per line.  The empty file contains 
        zero patterns, and therefore matches nothing.

grepの代わりにJoinを使う

このタイプの問題は自動車の運転室でより多く発生するため、あきらめてgrep代わりに使用することもできます。これは、一致するものを除いて、2番目のパラメータの一意の項目のみを表示したいという意味を使用する必要があります。joinjoinjoin -v 2getent ...

マニュアルページの追加
-a FILENUM
        also print unpairable lines from file FILENUM, where FILENUM is 
        1 or 2, corresponding to FILE1 or FILE2

-v FILENUM
        like -a FILENUM, but suppress joined output lines


$ join -v 2 <(who | awk '{print $1}' | sort -u) \
    <(getent passwd | awk -F: '{print $1}' | sort) | wc -l
53

メモ:usingに関する唯一の注意点joinは、両方のリストを並べ替える必要があるため、追加する必要が| sortあることですgetent ...

おすすめ記事