【Linux】idコマンドの使い方|UID・GID・所属グループの確認

【Linux】idコマンドの使い方|UID・GID・所属グループの確認

PR Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:6,700

Linuxのidコマンドを使って、ユーザーのUID(ユーザーID)・GID(プライマリグループID)・所属するサブグループを確認する方法を解説します。-u・-g・-G・-nオプションの使い方やシェルスクリプトでのroot権限判定、Docker実行時のUID指定など実務での活用例を紹介します。

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

初心者向け

わかばちゃんと学ぶ サーバー監視

難易度
実用性
読みやすさ

マンガと図解が中心で圧倒的に読みやすい。負荷調査の手法がスッと理解できるようになります。

新しいLinuxの教科書 第2版

難易度
実用性
読みやすさ

一生モノの基礎知識が身につく定番書です。

ゼロからわかる Linuxコマンド200本ノック―基礎知識と頻出コマンドを無理なく記憶に焼きつけよう!

難易度
実用性
習得度

アウトプット重視で記憶に定着しやすい。反復練習でLinux操作が自由自在になります。

エンジニア1年生のための世界一わかりやすいLinuxコマンドの教科書

難易度
実用性
読みやすさ

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 LTSGNU coreutils 9.4(id (GNU coreutils) 9.4)
AlmaLinux 9.4GNU 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 コマンドでの同等表現主な用途
idUID・ユーザー名、GID・プライマリグループ名、全所属グループのIDと名前idユーザーの識別番号(数値)と所属グループを一覧で確認したいとき
whoami現在の実効ユーザー名のみid -un今どのユーザーとして操作しているか名前だけを手早く知りたいとき
groups所属するグループ名の一覧のみid -Gn所属グループの名前だけをシンプルに確認したいとき

現在のユーザー名だけを確認したい場合は whoamiコマンドの使い方 で解説している whoami が手軽ですが、数値のUID・GIDを確認したい場合や、プライマリグループとサブグループを区別して確認したい場合は id コマンドを使用します。

基本構文と主なオプション一覧

id コマンドの基本構文は以下の通りです。

Terminal window
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)も追加で表示されます。

Terminal window
$ id
uid=1000(yo) gid=1001(yo) groups=1001(yo),4(adm),30(dip),44(video),46(plugdev),1000(google-sudoers)

出力結果の各項目は以下の意味を持っています。

項目出力例意味
uid1000(yo)実ユーザーID(UID) とカッコ内の ユーザー名。一般ユーザーは通常 1000 番以降、root は 0 番が割り当てられます。
euid0(root)実効ユーザーID(EUID)。SUIDプログラムの実行中など、実UIDと異なる場合のみ表示されます。
gid1001(yo)実プライマリグループID(主グループID) とそのグループ名。通常、新規にファイルやディレクトリを作成した際の所有グループとして使用されます。ただし、親ディレクトリにsetgidビットが設定されている場合は、親ディレクトリのグループが引き継がれます。
egid0(root)実効グループID(EGID)。SGIDプログラムの実行中など、実GIDと異なる場合のみ表示されます。
groups1001(yo),4(adm),...ユーザーが所属する すべてのグループ(プライマリグループ+サブグループ) のIDとグループ名の一覧です。

なお、AlmaLinuxやRocky Linuxなど、SELinuxが有効になっている環境では、通常の id コマンドの出力末尾に context=... という形式でセキュリティコンテキストが追加される場合があります。表示される内容はユーザーやプロセスの実行コンテキストによって異なります。

また、セキュリティコンテキストだけを取り出したい場合は、-Z(--context)オプションを使用します。SELinuxまたはSMACKが有効な環境で利用できます。

Terminal window
# セキュリティコンテキストのみを表示する(SELinuxまたはSMACK対応環境)
$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

※出力されるコンテキストは環境や実行プロセスの権限によって異なります。

特定のユーザーを指定して情報を確認する

引数にユーザー名を指定すると、自分以外のアカウントのUID・GID・所属グループを確認できます。/etc/passwd や /etc/group の情報は一般ユーザーでも参照できるため、他ユーザーの情報を確認するだけであれば sudo は不要です。

Terminal window
# rootユーザーの情報を確認する
$ id root
uid=0(root) gid=0(root) groups=0(root)
# 複数のユーザー(root と daemon)をまとめて確認する
$ id root daemon
uid=0(root) gid=0(root) groups=0(root)
uid=1(daemon) gid=1(daemon) groups=1(daemon)

例えば、useraddコマンドでユーザーを追加した後や、usermod -aG でグループを追加した後に、id <ユーザー名> を実行すれば設定が正しく反映されているかを即座に確認できます。

存在しないユーザー名を指定した場合は、以下のようにエラーメッセージが表示され、終了ステータス 1 が返ります。

Terminal window
$ id nonexistent_user
id: ‘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 を指定すると、数値ではなくユーザー名が出力されます。

Terminal window
# 現在のユーザーのUID(数値)のみを表示
$ id -u
1000
# 現在のユーザー名のみを表示(whoami と同等)
$ id -un
yo
# 指定したユーザー(root)のUIDを表示
$ id -u root
0

プライマリグループID(GID)またはグループ名だけを表示する(-g / -gn)

-g(--group)オプションは、プライマリグループ(主グループ)のGIDのみを出力します。-n を組み合わせて -gn とすると、プライマリグループの名前だけを取得できます。

Terminal window
# プライマリグループのGID(数値)のみを表示
$ id -g
1001
# プライマリグループの名前のみを表示
$ id -gn
yo

所属するすべてのグループID・グループ名を表示する(-G / -Gn)

-G(--groups)オプションは、プライマリグループとサブグループ(補助グループ)を含むすべての所属グループを表示します。

  • id -G: 所属する全グループのID(数値)を空白区切りで取得する
  • id -Gn: 所属する全グループの名前を空白区切りで取得する(引数なしの groups コマンドと同等の出力)
Terminal window
# 所属するすべてのグループID(数値)を空白区切りで表示
$ id -G
1001 4 30 44 46 1000
# 所属するすべてのグループ名を空白区切りで表示
$ id -Gn
yo adm dip video plugdev google-sudoers

なお、ユーザー名を指定した場合、groups root は root : root のように先頭に ユーザー名 : が付きますが、id -Gn root はグループ名のみ(root)を出力するため、シェルスクリプトで特定ユーザーの所属グループ一覧を取得する際は id -Gn <ユーザー名> のほうがパースしやすくなります。

また、-z(--zero)オプションを併用すると、各グループの区切り文字をスペースではなくNUL文字(\0)にして出力できます。グループ名に空白が含まれる可能性がある環境で xargs -0 などに安全に渡したい場合に利用します。

Terminal window
# NUL文字区切りでグループIDを出力し、od -c で中身を確認する
$ id -G -z | od -c
0000000 1 0 0 1 \0 4 \0 3 0 \0 4 4 \0 4 6 \0
0000020 1 0 0 0 \0
0000025

実効ID(Effective ID)と実ID(Real ID)の違いを確認する(-r)

デフォルトの -u や -g は、プロセスが現在持っている権限である「実効ID(Effective UID / GID)」を表示します。これに対して -r(--real)オプションを併用した id -ru や id -rg は、元の実行者のIDである「実ID(Real UID / GID)」を表示します。

Terminal window
# 実UID(Real UID)を表示
$ id -ru
1000

通常のコマンド実行では実効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 1
fi
echo "root権限(UID=0)での実行を確認しました。処理を開始します。"

シェルスクリプト内での数値比較(-ne や -eq)の書き方については、シェルスクリプトの比較演算子まとめもあわせて参照してください。

2. Dockerコンテナ実行時にホスト側のUID・GIDを引き継ぐ

Dockerコンテナ内でファイルを作成すると、コンテナ内のデフォルトユーザーである root(UID=0)の所有物になり、バインドマウントしているホスト側のディレクトリ上で一般ユーザーから編集・削除できなくなることがあります。

これを防ぐため、docker run の --user(または -u)オプションにコマンド置換で $(id -u):$(id -g) を渡すと、現在操作しているホスト側ユーザーのUID・GIDでコンテナ内のプロセスを実行できます。

Terminal window
# 現在のユーザーの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を指定してください。

Terminal window
# 補助グループ(例: 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のキャッシュを利用している環境では、キャッシュ更新のタイミングにより反映に時間がかかる場合があります)。
Terminal window
# 1. 現在のシェルセッションが保持している所属グループ名を確認(まだ反映されていない)
$ id -Gn
yo 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ライフを!
ITナレッジライフ 運営者
この記事を書いた人

Z (ITナレッジライフ)

現役のITエンジニア。Linux、プログラミング、IT用語など、日々の業務で得た「痒いところに手が届く」技術情報を発信しています。

プロフィールと編集ポリシーを見る →

Linuxユーザにお勧めの本 ↗

最新版

ゼロからはじめるLinuxサーバー構築・運用ガイド 第2版 動かしながら学ぶWebサーバーの作り方

難易度
実用性
最新度

Rocky Linux対応。実際にWebサーバーを公開するまでのプロセスを体験できる、最も確実で実践的なガイドブックです。

人気記事


記事を評価

Thanks!
目次
Scroll to Top