Linux のグループ内のすべてのユーザーをリストする方法

Linux では、ファイルには 3 つの権限セットがあります。1 つのセットはファイルのグループ用です。グループにファイルを割り当てる前に、グループ メンバーが誰であるかを確認したい場合があります。

ファイルとディレクトリの権限

Linux のファイルとディレクトリには、所有者用の権限セット、ファイルが割り当てられているグループ用の別のセット、および前の 2 つのカテゴリのいずれにも属さないすべてのユーザー用の権限があります。

各権限セットでは、そのカテゴリのメンバーがファイルを読み取ることができるか、書き込むことができるか、または実行できるかを定義します。ディレクトリの場合、実行アクションは、

<code>cd</code>

を使用してディレクトリに移動できることを意味します。

ファイルまたはディレクトリのデフォルト グループは、所有者のデフォルト グループです。通常は、作成したユーザーです。グループ権限は、ユーザーのグループがそのグループの他のメンバーのファイルやディレクトリに制御されたアクセス権を持つことを許可するために使用されます。

たとえば、開発チーム、ドキュメント チーム、調査チームなどがある場合があります。各チームのメンバーは、適宜名前を付けたグループに追加して、共同作業を支援できます。ユーザーは一度に複数のグループに所属できます。

シンプルでありながら堅牢なスキームです。ただし、ファイルが機密である場合は、作業を共有する前に、グループのメンバーが誰かを確認したほうが安心できる場合があります。これを行う方法はいくつかあります。しかし、注意してください。最も頻繁に推奨される 2 つの方法は問題があります。

/etc/groups ファイル

「/etc/group」ファイルには、コロン「

<code>:</code>

」で区切られたグループとグループ メンバーのリストが含まれています。各行には 4 つのフィールドがあります。

  • 名前: グループの一意の名前。
  • パスワード: 使用されません。これは常に「x」になります。
  • グループ ID: 一意のグループ識別子。
  • ユーザー: グループのメンバーのコンマ区切りのリスト。システム アカウントとデーモン アカウントのリストは通常空です。

ファイルの内容をターミナル ウィンドウにダンプするには、

<code>cat</code>

を使用できますが、less でファイルの内容をスクロールできるほうが便利です。

less /etc/group

リストの上部にあるエントリのほとんどにはメンバーがいませんが、「adm」グループには 2 人、「cdrom」グループには 1 人います。

特定のユーザーが所属しているグループを見つけたい場合は、grep を使用してユーザー アカウント名を含むエントリを検索できます。これは現在の作業ではありません。ある人が所属しているグループではなく、グループのメンバーである全員を確認します。しかし、一瞥するのは有益です。

grep "dave" /etc/group

文字列「dave」を含むエントリがリストされます。そして、その中に、物事が考えていたほど単純ではないかもしれないという兆候が隠されています。

ユーザーが Linux に追加されると、デフォルトのアクションは、ユーザー アカウントと同じ名前のグループに配置することです。これは、ユーザーのプライマリ グループです。追加された他のグループは、セカンダリ グループと呼ばれます。

問題は、ユーザーがプライマリ グループのメンバーとしてリストされないことです。そのため、「dave」グループにはメンバーが表示されませんが、ユーザー「dave」はそのグループのメンバーです。

もちろん、システム管理者は、任意のユーザーのプライマリ グループを他のグループのプライマリ グループに変更できます。つまり、ユーザーはどのグループのメンバーにもなれますが、「/etc/group」ファイルにはそのようにリストされません。それが 1 つの問題です。

2 つ目の問題は、「/etc/group」ファイルが唯一の情報源ではないことです。最新の Linux インストールでは、特に Lightweight Directory Access Protocol などのサービスが展開されている企業環境では、ユーザーとグループの情報を「/etc/passwd」と「/etc/group」以外の場所に保存することがよくあります。1 か所だけを見ると、全体像が見えない場合があります。

テスト シナリオでは、開発部門用に 4 つのグループを作成しました。それらは次のとおりです。

  • resteam: 調査チーム。
  • devteam: 開発チーム。
  • pvqteam: 製品検証および品質チーム。
  • docteam: ドキュメント チーム。

これらのチームに人々を追加しました。複数のチームに所属している人もいます。「/etc/group」ファイルをlessで開き、ファイルの一番下までスクロールすると、新しいグループとグループ メンバーが表示されます。少なくとも、「/etc/group」ファイルが認識しているメンバーは表示されます。

単一のグループを抽出したい場合は、grep を使用して検索できます。キャレット「^」は行の始まりを表します。

grep "^devteam" /etc/group

これはファイルから「devteam」エントリを抽出し、すべてのグループ メンバーをリストします。それともそうでしょうか。

getent コマンド

getent コマンドは、「/etc/group」だけでなく、複数のデータベースでユーザー グループ情報をチェックします。getent を使用してユーザー グループを表示します。

getent group

getentgroup オプションとともに使用すると、このテスト マシンでは、「/etc/group」ファイルを使用した場合と同じ結果が得られます。これは、LDAP やその他の中央命名サービスを使用していないためです。したがって、getent が参照できる情報源は他にありません。

したがって、結果が「/etc/group」ファイルの結果と一致するのは当然です。おそらく、私たちが見ているのは本当に状況の現実です。おそらく、すべてが単純明快で、このコンピューターでは、表示されているものがすべてでしょうか。それについては判断を保留しましょう。

getent コマンドは、単一のグループを調べてくれます。ここでは、「devteam」グループを見てみます。

getent group devteam

以前とまったく同じ結果が得られます。ただし、さらに詳しく調べる方法があります。

lid コマンド

lid コマンドは、libuser ツールのコレクションの一部です。これはすでに Fedora 36 のテスト コンピューターにインストールされていましたが、Ubuntu 22.04 と Manjaro 21 にはインストールする必要がありました。

また、このコマンドは Fedora と Manjaro では lid と呼ばれますが、Ubuntu では libuser-lid を使用する必要があります。

Ubuntu にコマンドをインストールするには、次のように入力します。

sudo apt install libuser

Manjaro では、libuser は AUR からインストールされるため、お気に入りの AUR ヘルパーを使用する必要があります。ここでは yay を使用しました。

yay libuser

libuser-lid を使用して、グループまたはユーザーに関するグループ情報を表示できます。個人に属するグループを表示するには、コマンドラインでそのユーザー アカウント名を渡します。Fedora と Manjaro では、libuser-lid の代わりに lid を使用する必要があることに注意してください。

sudo libuser-lib dave

グループのメンバーを見るには、-g (グループ) オプションをグループ名とともに使用します。

sudo libuser-lid -g devteam

すると、"francis" というユーザーがリストのメンバーとして表示されます。彼を見るのは初めてです。彼は「/etc/group」にはリストされておらず、getent でも発見されませんでした。

groups コマンドを使用して、ユーザーを数人見てみましょう。

groups abigail

groups hayden

groups francis

  • ユーザー「abigail」は、「abigail」というグループと、「resteam」と「devteam」という 2 つの他のグループに所属しています。
  • ユーザー「hayden」は、「hayden」というグループと、「pvqteam」と「docteam」という 2 つの他のグループに所属しています。
  • ユーザー「francis」は、「devteam」グループという 1 つのグループに所属しています。注目すべき点は、「francis」という名前のグループに所属していないことです。

すべてのユーザーはプライマリ グループのメンバーである必要があり、デフォルトではプライマリ グループの GID と名前はユーザーの UID とアカウント名と一致することがわかっています。ユーザー「francis」には何か違うところがあるようです。

id コマンドを使用して、UID と GID が何を教えてくれるかを見てみましょう。

id abigail

id francis

ユーザー「abigail」の UID は 1002 で、GID は 1002 です。彼らは 3 つのグループに所属しており、そのうちの 1 つは「abigail」と呼ばれています。GID は 1002 です。これがデフォルトのプライマリ グループです。

ユーザー「francis」の GID は 1019 で、「devteam」グループの GID と一致します。このユーザーには新しいプライマリ グループが割り当てられたか、「devteam」グループがこのユーザーがシステムに追加されたときにプライマリ グループとして設定されました。

どちらにしても、libuser-lid だけがそれらを検出し、「devteam」グループでの存在を報告しました。

悪魔は細部に宿る

したがって、真の細部を確認することが重要です。

グループは、共同作業を設定するための優れた方法ですが、誰に開放しているのかを知っている限りです。