LinuxLinux [リナックス / ライナックス]オープンソースのOSカーネルサーバーの運用や開発では、「現在ログインしているユーザーのUID(ユーザーID)やGID(グループID)を知りたい」「作成したユーザーが sudo や docker グループに正しく追加されているか確認したい」「シェルスクリプトが root 権限で実行されているか判定したい」といった場面がよくあります。
この記事では、ユーザーやグループの識別情報(UID・GID・所属グループ一覧)を表示する id コマンドの使い方を解説します。出力結果の読み方から、特定の値だけを抽出するオプションの組み合わせ、シェルスクリプトやDockerDocker [ドッカー]コンテナ型仮想化プラットフォームコンテナ実行時の活用例までを実機出力とともに紹介します。
この記事を読むことで、id コマンドを使ってユーザー権限やグループ所属状態を正確に把握し、日々のサーバー管理やスクリプト作成に役立てられるようになります。
確認した環境
本記事で解説するコマンドや出力結果は、以下の環境で実機検証を行っています(バージョン確認コマンド: id --version)。
| OSOS [オーエス]Operating System。基本ソフトウェア | GNU coreutils バージョン |
|---|---|
| DebianDebian [デビアン]コミュニティ主導で開発される安定性の高いLinuxディストリビューション GNU/Linux 11 (bullseye) | GNU coreutils 8.32(id (GNU coreutils) 8.32) |
| UbuntuUbuntu [ウブントゥ]人気のLinuxディストリビューション 24.04 LTS | GNU coreutils 9.4(id (GNU coreutils) 9.4) |
| AlmaLinux 9.4 | GNU coreutils 8.32(id (GNU coreutils) 8.32) |
Linuxのidコマンドとは?UID・GID・所属グループを確認する基本機能
id コマンドは、指定したユーザー(省略時は現在のユーザー)のユーザーID(UID)、プライマリグループID(GID)、および所属するすべてのグループ情報を表示するコマンドです。
Linuxは内部的にユーザーやグループを「名前」ではなく「数値のID(UID / GID)」で管理しています。ファイルの所有権やプロセスの実行権限を確認・制御する際には、ユーザー名とあわせて数値のIDや所属グループを確認できる id コマンドが広く使われます。
id・whoami・groupsコマンドの違いと使い分け
Linuxには現在のユーザーやグループを確認するコマンドとして whoami や groups も用意されています。それぞれの違いは以下の通りです。
| コマンド | 表示される情報 | id コマンドでの同等表現 | 主な用途 |
|---|---|---|---|
| id | UID・ユーザー名、GID・プライマリグループ名、全所属グループのIDと名前 | id | ユーザーの識別番号(数値)と所属グループを一覧で確認したいとき |
| whoami | 現在の実効ユーザー名のみ | id -un | 今どのユーザーとして操作しているか名前だけを手早く知りたいとき |
| groups | 所属するグループ名の一覧のみ | id -Gn | 所属グループの名前だけをシンプルに確認したいとき |
現在のユーザー名だけを確認したい場合は whoamiコマンドの使い方 で解説している whoami が手軽ですが、数値のUID・GIDを確認したい場合や、プライマリグループとサブグループを区別して確認したい場合は id コマンドを使用します。
基本構文と主なオプション一覧
id コマンドの基本構文は以下の通りです。
id [オプション] [ユーザー名...]引数に [ユーザー名...] を指定しない場合は、コマンドを実行している現在のプロセス(ユーザー)の情報を表示します。GNU coreutils の id では、複数のユーザー名を空白区切りで同時に指定することも可能です。
よく使用する主なオプションは以下の通りです。
| オプション | 長い形式 | 役割 |
|---|---|---|
| オプションなし | - | UID、GID、所属グループ(およびSELinuxまたはSMACK有効時はセキュリティコンテキスト)をまとめて表示する |
-u | --user | 実効ユーザーID(UID)のみを表示する |
-g | --group | 実効プライマリグループID(GID)のみを表示する |
-G | --groups | 所属するすべてのグループID(プライマリ+サブグループ)を空白区切りで表示する |
-n | --name | -u・-g・-G と併用し、数値のIDではなく「名前」を表示する |
-r | --real | -u・-g・-G と併用し、実効ID(Effective ID)ではなく実ID(Real ID)を表示する |
-z | --zero | -u・-g・-G と併用し、出力の区切り文字を空白や改行ではなくNUL文字(\0)にする |
-Z | --context | プロセスのセキュリティコンテキストのみを表示する(SELinuxまたはSMACK対応環境) |
オプション指定時の注意点:
-u、-g、-Gの3つは「指定した項目のみを出力する」オプションであるため、同時に複数指定すること(例:id -u -g)はできません(id: cannot print "only" of more than one choiceというエラーになります)。-n、-r、-zは単独では使用できず、必ず-u・-g・-Gのいずれかと組み合わせて使用します(単独で実行するとid: cannot print only names or real IDs in default formatなどのエラーになります)。
【基本】idコマンドの出力結果の読み方とユーザー指定
まずはオプションを付けずに id コマンドを実行し、出力される各項目の意味を確認しましょう。
オプションなしで現在のユーザー情報を表示する
引数やオプションを指定せずに id を実行すると、uid=(実UID)、gid=(実GID)、groups=(所属グループ)などの情報が1行で出力されます。実UIDと実効UID、または実GIDと実効GIDが異なる場合は、euid=(実効UID)や egid=(実効GID)も追加で表示されます。
$ iduid=1000(yo) gid=1001(yo) groups=1001(yo),4(adm),30(dip),44(video),46(plugdev),1000(google-sudoers)出力結果の各項目は以下の意味を持っています。
| 項目 | 出力例 | 意味 |
|---|---|---|
uid | 1000(yo) | 実ユーザーID(UID) とカッコ内の ユーザー名。一般ユーザーは通常 1000 番以降、root は 0 番が割り当てられます。 |
euid | 0(root) | 実効ユーザーID(EUID)。SUIDプログラムの実行中など、実UIDと異なる場合のみ表示されます。 |
gid | 1001(yo) | 実プライマリグループID(主グループID) とそのグループ名。通常、新規にファイルやディレクトリを作成した際の所有グループとして使用されます。ただし、親ディレクトリにsetgidビットが設定されている場合は、親ディレクトリのグループが引き継がれます。 |
egid | 0(root) | 実効グループID(EGID)。SGIDプログラムの実行中など、実GIDと異なる場合のみ表示されます。 |
groups | 1001(yo),4(adm),... | ユーザーが所属する すべてのグループ(プライマリグループ+サブグループ) のIDとグループ名の一覧です。 |
なお、AlmaLinuxやRocky Linuxなど、SELinuxが有効になっている環境では、通常の id コマンドの出力末尾に context=... という形式でセキュリティコンテキストが追加される場合があります。表示される内容はユーザーやプロセスの実行コンテキストによって異なります。
また、セキュリティコンテキストだけを取り出したい場合は、-Z(--context)オプションを使用します。SELinuxまたはSMACKが有効な環境で利用できます。
# セキュリティコンテキストのみを表示する(SELinuxまたはSMACK対応環境)$ id -Zunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023※出力されるコンテキストは環境や実行プロセスの権限によって異なります。
特定のユーザーを指定して情報を確認する
引数にユーザー名を指定すると、自分以外のアカウントのUID・GID・所属グループを確認できます。/etc/passwd や /etc/group の情報は一般ユーザーでも参照できるため、他ユーザーの情報を確認するだけであれば sudo は不要です。
# rootユーザーの情報を確認する$ id rootuid=0(root) gid=0(root) groups=0(root)
# 複数のユーザー(root と daemon)をまとめて確認する$ id root daemonuid=0(root) gid=0(root) groups=0(root)uid=1(daemon) gid=1(daemon) groups=1(daemon)例えば、useraddコマンドでユーザーを追加した後や、usermod -aG でグループを追加した後に、id <ユーザー名> を実行すれば設定が正しく反映されているかを即座に確認できます。
存在しないユーザー名を指定した場合は、以下のようにエラーメッセージが表示され、終了ステータス 1 が返ります。
$ id nonexistent_userid: ‘nonexistent_user’: no such user【オプション活用】UID・GID・グループ名だけを個別に抽出する方法
シェルスクリプトやコマンドの引数でUIDやグループ名を利用したい場合、uid=1000(yo) という形式のままでは扱いづらいため、-u・-g・-G および -n オプションを使って必要な値だけを取り出します。
ユーザーID(UID)またはユーザー名だけを表示する(-u / -un)
-u(--user)オプションを指定すると、実効ユーザーID(数値)のみが出力されます。さらに -n(--name)を組み合わせた -un を指定すると、数値ではなくユーザー名が出力されます。
# 現在のユーザーのUID(数値)のみを表示$ id -u1000
# 現在のユーザー名のみを表示(whoami と同等)$ id -unyo
# 指定したユーザー(root)のUIDを表示$ id -u root0プライマリグループID(GID)またはグループ名だけを表示する(-g / -gn)
-g(--group)オプションは、プライマリグループ(主グループ)のGIDのみを出力します。-n を組み合わせて -gn とすると、プライマリグループの名前だけを取得できます。
# プライマリグループのGID(数値)のみを表示$ id -g1001
# プライマリグループの名前のみを表示$ id -gnyo所属するすべてのグループID・グループ名を表示する(-G / -Gn)
-G(--groups)オプションは、プライマリグループとサブグループ(補助グループ)を含むすべての所属グループを表示します。
id -G: 所属する全グループのID(数値)を空白区切りで取得するid -Gn: 所属する全グループの名前を空白区切りで取得する(引数なしのgroupsコマンドと同等の出力)
# 所属するすべてのグループID(数値)を空白区切りで表示$ id -G1001 4 30 44 46 1000
# 所属するすべてのグループ名を空白区切りで表示$ id -Gnyo adm dip video plugdev google-sudoersなお、ユーザー名を指定した場合、groups root は root : root のように先頭に ユーザー名 : が付きますが、id -Gn root はグループ名のみ(root)を出力するため、シェルスクリプトで特定ユーザーの所属グループ一覧を取得する際は id -Gn <ユーザー名> のほうがパースしやすくなります。
また、-z(--zero)オプションを併用すると、各グループの区切り文字をスペースではなくNUL文字(\0)にして出力できます。グループ名に空白が含まれる可能性がある環境で xargs -0 などに安全に渡したい場合に利用します。
# NUL文字区切りでグループIDを出力し、od -c で中身を確認する$ id -G -z | od -c0000000 1 0 0 1 \0 4 \0 3 0 \0 4 4 \0 4 6 \00000020 1 0 0 0 \00000025実効ID(Effective ID)と実ID(Real ID)の違いを確認する(-r)
デフォルトの -u や -g は、プロセスが現在持っている権限である「実効ID(Effective UID / GID)」を表示します。これに対して -r(--real)オプションを併用した id -ru や id -rg は、元の実行者のIDである「実ID(Real UID / GID)」を表示します。
# 実UID(Real UID)を表示$ id -ru1000通常のコマンド実行では実効IDと実IDは同じ値になりますが、SUID(Set User ID)ビットが設定されたプログラムを実行している最中などは、実ID(起動した一般ユーザー)と実効ID(ファイル所有者の root など)が異なる状態になります。なお、sudoコマンドでコマンドを実行した場合は、実UID・実効UIDともに 0(root)に切り替わるため、元の実行ユーザーを知りたい場合は環境変数 $SUDO_UID や $SUDO_USER を参照します。
実務で役立つidコマンドの活用パターン
ここからは、実際のサーバー構築やシェルスクリプト作成、コンテナ運用で id コマンドがよく使われる3つのパターンを紹介します。
1. シェルスクリプトでroot権限(UID=0)かどうかを判定する
パッケージのインストールやシステム設定ファイルを変更するシェルスクリプトでは、実行ユーザーが root(または sudo 経由の実行)であるかを最初にチェックし、一般ユーザーであればエラーメッセージを出して終了させる処理がよく書かれます。
このとき、ユーザー名が "root" かどうかを比較するよりも、id -u の結果が 0 かどうかで判定するのが確実です。LinuxではUID 0 がrootユーザーに割り当てられるため、通常のroot権限チェックには id -u による数値判定が適しています。
ただし、Dockerコンテナ内やユーザー名前空間(User Namespace)が有効な環境では、コンテナ内のUIDが0であってもホスト側のrootと同等の特権を持つとは限らない点には留意してください。
#!/bin/bash
if [ "$(id -u)" -ne 0 ]; then echo "エラー: このスクリプトは root または sudo 権限で実行してください。" >&2 exit 1fi
echo "root権限(UID=0)での実行を確認しました。処理を開始します。"シェルスクリプト内での数値比較(-ne や -eq)の書き方については、シェルスクリプトの比較演算子まとめもあわせて参照してください。
2. Dockerコンテナ実行時にホスト側のUID・GIDを引き継ぐ
Dockerコンテナ内でファイルを作成すると、コンテナ内のデフォルトユーザーである root(UID=0)の所有物になり、バインドマウントしているホスト側のディレクトリ上で一般ユーザーから編集・削除できなくなることがあります。
これを防ぐため、docker run の --user(または -u)オプションにコマンド置換で $(id -u):$(id -g) を渡すと、現在操作しているホスト側ユーザーのUID・GIDでコンテナ内のプロセスを実行できます。
# 現在のユーザーのUIDとGIDを指定してコンテナを実行する例docker run --rm -u "$(id -u):$(id -g)" -v "$PWD:/work" -w /work alpine touch test.txtこのように記述しておけば、実行する開発者ごとにUIDやGIDが異なっていても、スクリプトや手順書を書き換えることなく適切なファイル所有権を維持できます。
ただし、--user(または -u)で指定できるのはUIDとプライマリGIDです。ホスト側ユーザーが所属している補助グループ(Supplementary Groups)までは自動的には引き継がれません。もしコンテナ内で追加のグループ権限が必要な場合は、Dockerの --group-add オプションを使って明示的にGIDを指定してください。
# 補助グループ(例: GID 1000)を追加して実行する例docker run --rm \ --user "$(id -u):$(id -g)" \ --group-add 1000 \ -v "$PWD:/work" \ -w /work \ alpine touch test.txt※ 1000 は追加したいグループのGIDの例です。
ファイルやディレクトリの所有権の仕組みについては、chmod・chownコマンドによる権限と所有者の変更で詳しく解説しています。
3. グループ追加(usermod -aG)の反映漏れを切り分ける
sudo usermod -aG docker $USER などで自分のユーザーを新しいグループに追加した直後は、設定ファイル(/etc/group)上では追加されていても、現在ログインしているシェルセッションにはまだ新しいグループ権限が反映されていません。
この状態を切り分ける際に、「引数なしの id」と「ユーザー名を指定した id $USER」を比較する方法が役立ちます。
id(引数なし): 現在のシェルプロセスが保持しているグループ情報を表示する(再ログイン前のため、追加したグループがまだ表示されない)。id "$USER"(ユーザー名指定): NSS(Name Service Switchswitch [スイッチ]ネットワーク内で複数の機器を接続し、必要な宛先のみにデータを送る機器)を通じてユーザー・グループ情報を取得する。グループデータベースに追加された情報が反映されるため、再ログイン前でも追加したグループを確認できる(※NSSのキャッシュを利用している環境では、キャッシュ更新のタイミングにより反映に時間がかかる場合があります)。
# 1. 現在のシェルセッションが保持している所属グループ名を確認(まだ反映されていない)$ id -Gnyo adm sudo
# 2. NSS経由でデータベース上の最新の所属グループ名を確認(追加済みであることが確認できる)$ id -Gn "$USER"yo adm sudo dockerもし id -Gn "$USER" には対象グループ(上記例の docker)が表示されているのに、引数なしの id -Gn には表示されていない場合は、一度ログアウトして再ログインする(または一時的に newgrp <グループ名> を実行する)ことで現在のセッションにグループ権限が反映されます。
まとめ:idコマンドでユーザー識別子とグループ権限を正確に確認しよう
本記事では、Linuxの id コマンドによるUID・GID・所属グループの確認方法と実務での活用法を解説しました。
記事の要点を以下にまとめます。
- オプションなしで
idを実行すると、現在のユーザーのuid(ユーザーID)、gid(プライマリグループID)、groups(所属する全グループ)を一覧で確認できる。 - 引数に
id <ユーザー名>を指定すると、他のユーザーのUID・GIDやグループ所属状況を調べられる。 - 特定の値だけを抽出したい場合は、
-u(UID)、-g(プライマリGID)、-G(全グループID)を使い、名前で取得したい場合は-nを組み合わせる(-un、-gn、-Gn)。 - シェルスクリプトでの
root権限チェック([ "$(id -u)" -ne 0 ])や、Docker実行時のユーザー指定(-u "$(id -u):$(id -g)")など、自動化や権限管理の場面で幅広く活用できる。
ユーザーの作成・削除やファイル権限の設定など、Linuxのアカウント管理全般とあわせて整理したい方は、Linuxのユーザー・権限管理コマンドまとめもぜひ参考にしてください。
以上で本記事の解説を終わります。
よいITライフを!
人気記事
- 1
- 2
- 3
- 4
- 5
Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。