すべてのユーザー名および/またはホームディレクトリをどのように一覧表示できますか?

すべてのユーザー名および/またはホームディレクトリをどのように一覧表示できますか?

コンピュータ上のすべてのユーザーのディレクトリを一覧表示したいと思います。一般的に私はそうします:

ls -l /home

しかし、私は他の人のコンピュータ、つまりmyHomeのように家と呼ばれていないコンピュータに配布されるスクリプトでそれを使用しています。

だから私はそれをls -l ~

どのように要約できますか?

ベストアンサー1

多くのシステムには、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]}'

(ユーザー名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そして、まだユーザー名のリストを取得する方法を見つける必要があります。

一部のシェルには、ユーザー名のリストを取得する機能が組み込まれています。

  • bashcompgen -uデータベース内の列挙可能なユーザーのリストを返します。
  • zsh$userdirsユーザー名をホームディレクトリにマップする連想配列(列挙可能なデータベースに制限されていますが、列挙~user不可能なデータベースのユーザーに対して拡張するとエントリが追加されます$userdirs)。だからあなたはこれを行うことができます:

    printf '%s => %s\n' "${(kv@)userdirs}"
    

    ユーザーとそのホームディレクトリを一覧表示します。

    ただし、zsh対話する場合にのみ機能します。

  • tcshfishそして、yashユーザー名を完成させる3つの異なるシェル(例:引数が完成したとき~<Tab>)がありますが、プログラムでユーザー名のリストを取得できるようには見えません。

おすすめ記事