多くのシステムが持っている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>
引数を補完する場合)が、プログラムでユーザー名のリストを取得できるようには見えません。