多くのシステムが持っているgetentリストまたはクエリの内容にコマンドをネームサービスなどのデータベースpasswd、group、services、protocols...
getent passwd | cut -d: -f6
列挙可能なデータベース内のすべてのユーザーのホームディレクトリ(6 番目のコロン区切りフィールド)をリストします。
ユーザー名自体は最初のフィールドにあるため、ユーザー名のリストの場合:
getent passwd | cut -d: -f1
(これらのユーザーがシステムにログインできる、またはホームディレクトリが作成されているわけではありませんが、システムに認識されているため、ユーザーIDに変換できることに注意してください)。
列挙できないデータベースの場合、考えられる各ユーザーIDを個別に照会して照会できます。
getent passwd {0..65535} | cut -d: -f1,6
(ここでは、uidが65535で停止する(一部のシステムはそれ以上をサポートする)と、zshの{x..y}形式のブレース展開をサポートするシェルを想定しています)。しかし、LDAP、NIS +、SQLなどのユーザーデータベースがネットワーク化されている(そしてローカルキャッシュが限られている)システムでは、これを頻繁に行いたくないでしょう。 )これらすべてのクエリを作成します。
また、同じuidを共有している複数のユーザーがいる場合、各uidに対して1つのエントリしか取得できないため、他のエントリは見逃します。
持っていない場合はgetent、次の手段を使用できますperl。
perl -le 'while (@e = getpwent) {print $e[7]}'
for getent passwd($e[0]ユーザー名)、または:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
以下のためのgetent passwd {0..65535}同じ警告を持ちます。
シェルでは、を使用~userしてのホームディレクトリを取得できますuserが、ほとんどのシェルでは、限られたユーザー名のセット(その~拡張演算子でサポートされるユーザー名に使用できる文字のリストはシェルごとに異なります)いくつかのシェル(を含むbash)~$userは機能しません(evalユーザーの名前がそこの変数に格納されている場合に頼る必要があります)。また、ユーザー名のリストを取得する方法を見つける必要があります。
一部のシェルには、ユーザー名のリストを取得するためのサポートが組み込まれています。
bash:compgen -u列挙可能なデータベース内のユーザーのリストを返します。
zsh:$userdirs連想配列は、ユーザー名をホームディレクトリにマップします(列挙可能なデータベースに限定されますが、列挙~user不可能なデータベースにいるユーザーに対して拡張を行うと、エントリがに追加されます$userdirs)。だからあなたができる:
printf '%s => %s\n' "${(kv@)userdirs}"
ユーザーをホームディレクトリとともに一覧表示します。
zshただし、インタラクティブな場合にのみ機能します。
tcsh、fishおよびyashは、ユーザー名を補完できる他の3つのシェルです(たとえば、~<Tab>引数を補完する場合)が、プログラムでユーザー名のリストを取得できるようには見えません。