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

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

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

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

答え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 ...

答え2

この行は機能します:

grep -Ev $(users | sed 's/ /|/g') /etc/passwd | awk -F: {'print $1'}

どのように動作しますか?:

の出力には、ログインしたユーザーの別々のリストが表示さusers | sed 's/ /|/g'れます。|

grepオプションを使用すると、-EOR条件下で複数の文字列を一致させることができます。この-vオプションは、指定された文字列/パターンと一致しないすべてを印刷します。 -Eを結合すると、-vパイプで区切られた文字列を含まない出力のすべての行が一覧表示されますusers | sed 's/ /|/g'。最後に、awkユーザー名のみをフィルタリングするために使用されます。

答え3

現在ログインしているユーザーの数を1つのファイルに保存し、ユーザーの総数を別のファイルに保存してcomm処理するスクリプトを作成したい場合があります。

たとえば、

#!/bin/bash

w | awk 'NR > 2 {print $1}' | sort > logged.txt #sorted list of logged users
awk -F':' '{ print $1}' /etc/passwd | sort > allusers.txt #sorted list of all users
comm -23 allusers.txt logged.txt #find lines unique to allusers.txt

関連情報