所属しているグループ内で一時的にプライマリグループを変更する|newgrp / sg / SGIDで使い分けるグループ切り替え術

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, システム管理, ユーザー管理 > 所属しているグループ内で一時的にプライマリグループを変更する|newgrp / sg / SGIDで使い分けるグループ切り替え術

この記事のポイント

・newgrpコマンドを使うと、所属しているグループ内で一時的にプライマリグループを変更できる
・プライマリグループの一時的な切り替えはサブシェルとして動作し、exitで元のグループに戻れる
・newgrpはログインし直しと同じ扱いなので、環境変数や作業ディレクトリの挙動に注意が必要
・現代のLinux(RHEL9系・Ubuntu 24.04系)でも newgrp は標準コマンドとしてそのまま動く

ユーザーが複数のグループに所属している場合、通常はプライマリグループの メンバーとしてコマンドを実行します。しかし、プライマリグループ以外の権限を 必要とする処理を実行する場合は、ユーザーが所属しているグループ内で 一時的にプライマリグループを変更できます。 一時的にプライマリグループを変更するには、 newgrpコマンドにグループ名を付けて実行します。 [miyazaki@Tiger ~]$ whoami ←ユーザー名を確認します。 miyazaki [miyazaki@Tiger ~]$ cat /etc/group | grep miyazaki ↑ユーザー「miyazaki」の所属グループを確認します。 nobody:x:99:miyazaki miyazaki:x:601: [miyazaki@Tiger ~]$ newgrp nobody ←グループ「nobody」に変更します。
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

プライマリグループとセカンダリグループの違いをまず押さえる

Linuxのユーザーは必ず1つの「プライマリグループ」を持ち、加えて任意の数の「セカンダリグループ」(補助グループ)に所属できます。プライマリグループは /etc/passwd の4番目のフィールドに記録され、ユーザーが新しくファイルを作成したときに、そのファイルのグループ所有者として自動的に設定されます。 一方、セカンダリグループは /etc/group のメンバー欄に追加で記載されているグループで、ファイルやディレクトリへのアクセス権限を共有するためだけに使われます。新規ファイル作成時のグループ所有者にはなりません。ここに「一時的にプライマリグループを変更したい」という需要が生まれます。 たとえば webgroup というグループでファイルを共有しているチームの場合、共有ディレクトリで作ったファイルを最初から webgroup 所有にしたい、という場面で newgrp が役立ちます。

newgrpコマンドの基本構文と動作イメージ

newgrpコマンドは、シェルセッション内でプライマリグループだけを一時的に切り替えるためのコマンドです。書式はとてもシンプルです。 [user@host ~]$ newgrp グループ名 newgrpを実行すると、内部的には「新しいサブシェルが起動して、その中でプライマリグループだけが指定したグループに置き換わる」という動作をします。元のシェルが消えるわけではなく、サブシェルが上に積み重なるイメージです。 そのため作業が終わったあとはexitコマンドで元のシェルに戻れます。 [miyazaki@Tiger ~]$ newgrp webgroup ←プライマリグループをwebgroupに変更 [miyazaki@Tiger ~]$ id -gn webgroup [miyazaki@Tiger ~]$ exit ←元のシェルに戻る [miyazaki@Tiger ~]$ id -gn miyazaki このようにnewgrp + exitの往復で「一時的に変更する」運用が成立します。

所属していないグループにはnewgrpできない(パスワード方式の歴史も含めて)

newgrpは「ユーザーが所属しているグループ」にしか切り替えられません。所属していないグループ名を指定するとエラーになります。 [miyazaki@Tiger ~]$ newgrp adm newgrp: グループ 'adm' のパスワード: ここで「グループパスワード」を要求された場合、それは /etc/gshadow に gpasswd で設定されたパスワードが必要なケースです。ただし現代のLinux運用ではグループパスワードはほぼ使われず、usermod -aG でセカンダリグループに正規に追加するのが標準です。 セキュリティ監査の観点でも、グループパスワードによる一時昇格は監査ログが残りにくいため非推奨とされています。所属していないグループの権限が必要な場合は、sudoまたは正規のグループ追加で対応するのが安全です。

id・groupsコマンドでプライマリグループ変更を確認する

newgrp実行前後の状態を確認するには、idコマンドまたはgroupsコマンドを使います。 [miyazaki@Tiger ~]$ id uid=1000(miyazaki) gid=601(miyazaki) groups=601(miyazaki),99(nobody) [miyazaki@Tiger ~]$ newgrp nobody [miyazaki@Tiger ~]$ id uid=1000(miyazaki) gid=99(nobody) groups=99(nobody),601(miyazaki) 注目すべきはgid(プライマリグループID)が601→99に変わっている点です。groupsの並び順も「現在のプライマリ」が先頭にきます。idを使うと、UID・プライマリGID・セカンダリGIDが一覧で確認できるので、newgrpの効果を一発で見比べるならid -gnまたはid単体での実行が便利です。

newgrpで作ったファイルのグループ所有者を確認する

newgrpの真価は「これから作るファイルのデフォルトグループを切り替える」点にあります。実際にtouchで空ファイルを作って、グループ所有者の差を比較してみます。 [miyazaki@Tiger ~]$ touch before.txt ←newgrp前にファイルを作成 [miyazaki@Tiger ~]$ newgrp nobody [miyazaki@Tiger ~]$ touch after.txt ←newgrp後にファイルを作成 [miyazaki@Tiger ~]$ ls -l before.txt after.txt -rw-r--r-- 1 miyazaki miyazaki 0 11月 9 16:30 before.txt -rw-r--r-- 1 miyazaki nobody 0 11月 9 16:31 after.txt before.txtのグループはmiyazaki、after.txtのグループはnobodyになっていることが確認できます。複数人で共有ディレクトリを使う運用では、newgrpで共有グループに切り替えてからファイルを作ると、後からchgrpで一括修正する手間が省けます。

SGIDディレクトリと組み合わせるとnewgrpは不要になることが多い

ただし共有ディレクトリ運用に限れば、newgrpを毎回叩かなくても済む方法があります。ディレクトリにSGID(Set Group ID)属性を付けると、そのディレクトリ配下で作成されたファイルは自動的にディレクトリのグループを継承します。 [root@Tiger ~]# mkdir /share [root@Tiger ~]# chgrp webgroup /share [root@Tiger ~]# chmod 2775 /share ←先頭の2がSGID [root@Tiger ~]# ls -ld /share drwxrwsr-x 2 root webgroup 4096 11月 9 16:35 /share SGIDが効いていると、/share配下で誰がファイルを作っても自動的にwebgroup所有になります。毎回newgrpを叩くよりもチーム運用としては圧倒的に楽になるので、共有用途では「SGIDディレクトリ+セカンダリグループ追加」の組み合わせが定番です。 newgrpは「単発で一時的に切り替えたい」場面で残し、恒常的な共有運用ではSGIDを使う、という棲み分けが現実的です。

sg(sudo group)コマンドという代替手段

newgrpと似たコマンドにsgがあります。書式は newgrp に近いですが、サブシェルを起動せずに「単発のコマンドだけをそのグループ権限で実行する」という違いがあります。 [miyazaki@Tiger ~]$ sg nobody -c "touch /tmp/test.txt" [miyazaki@Tiger ~]$ ls -l /tmp/test.txt -rw-r--r-- 1 miyazaki nobody 0 11月 9 16:40 /tmp/test.txt sgはシェルにずっと留まらないので、シェルスクリプト内で「1コマンドだけグループを切り替えて実行したい」という用途で便利です。逆に、対話的に複数の作業をする場合はnewgrp + exitの方が自然です。

【重要】newgrp運用の落とし穴とトラブル回避

newgrpは便利ですが、いくつか注意点があります。 1つ目は「新しいサブシェルが起動するため、シェル変数や関数定義が引き継がれない」点です。事前にexportしていない一般変数や、shrc系で定義した関数は新しいサブシェルでは見えません。スクリプト中で newgrp を挟んだ場合、シェル変数が消えたように見えるバグの原因になります。 2つ目は「カレントディレクトリは引き継がれる」ものの「環境変数の一部はリセットされる可能性がある」点です。distroによってはPATHやPS1が再初期化されることがあるため、newgrp実行後にプロンプトの見た目が変わるケースがあります。 3つ目は「nested(多重)newgrpを繰り返すとexit回数を間違える」事故です。newgrp A → newgrp B → exit としても、まだ最初のnewgrp Aのサブシェルにいる状態なので、もう一度exitが必要です。複雑な切り替えは避け、必要なときだけ単発で使うのが安全です。 4つ目は「sudoとの組み合わせはおすすめしない」点です。sudoはユーザー切り替え+特権昇格を一括で処理しますが、その中でnewgrpを入れ子にすると意図しないUID/GIDになることがあります。sudoとnewgrpの併用は避け、目的別に使い分けます。

「newgrp: グループ ○○ にユーザー名が見つかりません」が出た時の対処

newgrp実行時に「newgrp: ユーザー miyazaki は グループ webgroup に所属していません」のようなエラーが出るケースがあります。これはセカンダリグループとしての所属が完了していない状態です。 [miyazaki@Tiger ~]$ newgrp webgroup newgrp: ユーザー miyazaki は グループ webgroup に所属していません このときは、まずrootで該当ユーザーを正規にセカンダリグループに追加します。 [root@Tiger ~]# usermod -aG webgroup miyazaki [root@Tiger ~]# id miyazaki uid=1000(miyazaki) gid=601(miyazaki) groups=601(miyazaki),99(nobody),603(webgroup) ここで重要なのは usermod -aG の -a(append)オプションを必ず付けることです。-a を付け忘れると、既存のセカンダリグループがすべて上書きで消えてしまうという有名な事故が起きます。Wheelグループ等から外れてsudoが効かなくなる事例もあるため、必ずappend指定で追加します。 追加後、いったんログアウト&再ログイン(または newgrp - のように新規ログイン扱い)すれば、newgrpできるようになります。

本記事のまとめ:newgrpコマンド早見表

最後に、newgrpまわりでよく使う操作を一覧にまとめます。
目的 コマンド例
所属グループ内で一時的にプライマリグループを変更 newgrp グループ名
元のプライマリグループに戻る exit
現在のプライマリグループを確認 id -gn または groups
セカンダリグループにユーザーを追加(恒久) sudo usermod -aG グループ名 ユーザー名
1コマンドだけグループを切り替えて実行 sg グループ名 -c "コマンド"
共有ディレクトリで自動グループ継承 chmod 2775 ディレクトリ(SGID)
newgrpは「ユーザーが所属しているグループ内で一時的にプライマリグループを変更する」ための軽量コマンドです。恒常的な共有運用ではSGIDディレクトリ、単発の権限切り替えではsgコマンド、対話的な作業切り替えではnewgrp、という棲み分けで使い分けると、グループ管理の手数を大きく減らせます。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。