Linux 講座 / ユーザー・グループとファイル所有権を理解する
LinuxはユーザーにUID(ユーザーID)、グループにGID(グループID)を付与し、ファイルには所有ユーザーと所有グループを記録します。アカウントには基本グループと追加グループがある場合があります。現在のアカウントやファイルの所有権を確認する際はid、groups、getent、ls -lを使用します。この講座では所有権を変更せず、表示された情報を正確に読むことに集中します。
アカウント・グループの確認は所有者とアクセス権の読み取りの準備段階です。グループ変更後に新しいログインセッションが必要な理由を理解したうえで、権限の問題を判断してください。
ユーザーIDとグループIDの意味
人が見るlearnerのようなアカウント名とシステムが使用する数字のUIDは対応関係にあります。グループも名前と数字のGIDを持ちます。ユーザーの基本グループはアカウント情報で指定された代表グループであり、追加グループは別途参加したグループです。実際の権限の判断には、所有ユーザー・グループやファイルの権限ビットなども一緒に使用されます。グループに属しているというだけで、そのグループが所有するすべてのファイルを読み書きできるわけではありません。
rootは一般的にUID 0を持つ管理者アカウントです。一般アカウントのUIDやGIDが必ず1000から始まると仮定しないでください。値はシステムやアカウント作成ポリシーにより異なります。
現在のセッションのユーザーとグループを確認する
次のコマンドは一般ユーザーとして実行でき、アカウントを変更しません。idは現在のユーザー・基本グループ・参加グループの名前と数値IDを表示します。id -unはユーザー名、id -gnは基本グループ名、id -nGは参加グループ名を出力します。
id
id -un
id -gn
id -nG
groups
例えばidの結果にuid=1000(learner) gid=1000(learner) groups=1000(learner),10(wheel)のように表示されることがあります。これは説明のための例であり、実際の名前・数値・グループはシステムごとに異なります。gid=...は基本グループ、groups=...は現在のセッションに適用されたグループの一覧です。
groupsも現在のセッションのグループ名を簡単に確認します。管理者がグループ所属を変更した場合でも、すでに開かれているログインセッションのグループ一覧はすぐに変わらないことがあります。ユーザーデータベースの設定と現在のプロセスに適用されているグループを区別してください。
getentでアカウントデータを参照する
getentはシステムのName Service Switch(NSS)が使用するアカウント・グループデータベースを照会します。環境によってはローカルファイルだけでなく外部ディレクトリサービスの結果も含まれることがあるため、/etc/passwdだけを直接読むよりも実際の名前照会方法をよく反映できます。次の例は現在のユーザーと基本グループを照会します。
getent passwd "$(id -un)"
getent group "$(id -gn)"
getent passwdの1行は通常、名前、パスワードプレースホルダー、UID、基本GID、説明、ホームディレクトリ、ログインシェルをコロンで区切ります。パスワード自体がその行に平文で表示されるわけではありません。getent groupはグループ名やGIDなどを示します。グループ項目のメンバーリストだけを見て基本グループを使用するユーザーをすべて知ることはできないので、ユーザーの実際のグループはidで確認する方が良いです。
最小インストール環境ではgetentが存在しない場合があります。そのときはインストールされたlibc・ディストリビューションの照会ツールを確認してください。アカウント情報を変更するために/etc/passwdや/etc/groupを勝手に直接編集しないでください。
ファイルの所有ユーザーとグループの読み取り
実習用ファイルを作成して所有権を確認してみます。~/linux-course-16-practiceがすでに存在する場合は別の名前を付け、mkdirが失敗した場合は後続のコマンドを実行しないでください。touchは既存のファイルに実行すると日時を変更することができます。
mkdir ~/linux-course-16-practice
cd ~/linux-course-16-practice
pwd
touch own.txt
ls -l own.txt
ls -lの出力で権限とリンク数の次に出てくる二つの名前は、通常所有ユーザーと所有グループです。新しいファイルは通常現在のユーザーが所有しますが、グループの選択は親ディレクトリの設定やファイルシステムの動作に影響される可能性があるため、基本グループと同じだと安易に決めつけないでください。サイズや日時も環境によって異なります。
GNU statで名前と数字IDを一行で抽出して比較することもできます。%U/%Gは所有ユーザー・グループ名、%u/%gはその数字IDです。
stat -c '%U | %G | %u | %g | %n' own.txt
例えばlearner | learner | 1000 | 1000 | own.txtのように表示されることがありますが、実際の値を確認する必要があります。所有権は「誰が所有しているか」を記録し、権限は「何ができるか」を決定する別情報です。ファイル所有者を変更するchownはシステムやデータに影響を与えるため、この所有権を変更しない実習では実行しません。
混同しやすい三つの区別
- ユーザー名とUID: 名前は表示・閲覧用であり、ファイルシステムは数値IDも使用します。
- 基本グループと追加グループ: アカウントの基本グループ1つと、現在のセッションの複数のグループを区別します。
- アカウントデータと現在のセッション: データベースを変更しても、既に開いているセッションのグループ一覧は変わらない場合があります。
権限の問題に直面した時は、まずidで現在のセッションのユーザー・グループを確認し、ls -lまたはstatで対象ファイルの所有権を確認してください。両方の結果がどのように関連しているかを確認した後、権限設定を調査することで原因を絞り込むことができます。
公式ドキュメント
GNU Coreutils マニュアルは id・groups・ls・stat を、getent(1) マニュアル と nsswitch.conf(5) マニュアル はアカウント情報の参照経路について説明します。




