web-dev-qa-db-ja.com

すべての人間のユーザーをリストする

作成したすべての人間のユーザーを一覧表示するにはどうすればよいですか? cat /etc/passwdを試してみましたが、それは多くのものをリストしています。

19

人間のユーザーは1000から始まるUIDを持っているので、その事実を使用して非人間を除外できます。

cut -d: -f1,3 /etc/passwd | egrep ':[0-9]{4}$' | cut -d: -f1

これは、最初の(ユーザー名)および3番目(UID)のコロンで区切られたフィールドを/etc/passwdから切り取り、次にコロンと4桁で終わる結果の行をフィルタリングし、その後、最初の(ユーザー名)フィールドを切り取ります。 UIDが1000から9999のユーザーのリストがあります。

システムに9000人以上のユーザーがいる場合、これは失敗しますが、nobody(UID 65534)をキャッチしないために、結果を4桁のUIDに制限する必要があります。

18
user132994

これは 受け入れられた答え が行うこととほぼ同じことを行い、3つではなく1つのコマンドで実行されます。

awk -F: '$3 >= 1000 && $1 != "nobody" {print $1}' /etc/passwd

コメントのKarelのおかげで、nobodyユーザーも除外されています。

15
Oli

私は個人的にちょうど使用したい:

ls /home

確かに、これはユーザーのリストではなく、ホームディレクトリのリストです。現在システムに存在する人間のユーザーは、/homeにホームディレクトリがありますが、削除された過去のユーザーのホームディレクトリも表示される場合があります。

これは私の目的のために機能し、あなたのものにも機能する可能性があります。たとえば、存在しないことが判明したユーザーアカウント(nonexistent-user)を削除してコマンドを実行する場合

Sudo deluser nonexistent-user

このユーザーが存在しないことがわかります。

7
Sam Hamblin

TL; DR:SystemAccount = falseを持つのは人間のユーザーのみです

もう1つの方法は、ルートls /var/lib/AccountsService/users/ | grep -v rootを無視しながらの出力をリストすることです。奇妙なことに、gdm、グリーター/ログイン画面(または正式にはデスクトップマネージャー)もユーザーとしてリストされます。リストからだけでは、gdmが人間であるかどうかはわかりません。

より効率的で正しいアプローチは、そのフォルダー内のファイルを調べて、どのユーザーがSystemAccount=falseを持っているとしてリストされているかを調べることです。ワンライナーベローズはそれを達成します

grep SystemAccount=false /var/lib/AccountsService/users/* | awk -F '/' '{gsub(":","/");print $6}'

1

Buntuシステムでは、通常のユーザー(人間のユーザー)には、アカウントが最初に作成されたときに順番に割り当てられる1000で始まるUIDがあります。要するに、buntuシステムで作成された最初のアカウントのUIDは1000です。次に作成されたアカウントのUIDは1001です。以下同様です。

したがって、システム上に存在するすべての人間のユーザーアカウントをリストする最も簡単な方法は、私の意見では、ユーザーのUIDを含む/etc/passwdファイルの3番目の列が1000以上であるかどうかを確認することです、たとえば、2000(一般的なデスクトップPCが1,000を超えるユーザーアカウントを持つことはほとんどありません、そうは思いませんか?):

$ awk -F$':' '{ if ($3 >= 1000 && $3 < 2000) print $1; }' /etc/passwd
1
misha

パーティに参加して、LDAPを使用するネットワークシステムを監督します。/homeの外部にホームディレクトリがあり、数百万のUID(スクリプトの不具合)があります。したがって、現在の答えはどれも機能しません。私のために働くテストは、ユーザーが有効なログインシェルを持っているかどうかをチェックしています。有効なシェルは /etc/shells にリストされているものです。最も単純な形式:

getent passwd | grep -wFf /etc/shells

ファイルにはコメント(または空の行)が含まれている可能性があるため、コメントを除外する必要がある場合があります。

getent passwd | grep -wFf <(grep '^/' /etc/shells)
1
muru