システムにログインしていないユーザー数を確認するコマンドはありますか?
ログインしているユーザー数とログインしていないユーザー数を数えるシェルスクリプトを作成しようとしています。
答え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番目のパラメータの一意の項目のみを表示したいという意味を使用する必要があります。join
join
join -v 2
getent ...
-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オプションを使用すると、-E
OR条件下で複数の文字列を一致させることができます。この-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