再ログインせずにログイン中ユーザの所属グループの変更を反映する方法

Bash,CentOS,Linux,Ubuntu

はじめに

UNIX 系の OS では、ログイン中のユーザの所属グループを変更した場合、一度ログアウトしなければ変更が反映されません。

しかし、あるコマンドを使えば再ログインせずにログイン中のユーザの所属グループを変更し、その変更を反映させる方法があります。

この記事では、その方法を紹介します。

検証環境

$ uname -moi
aarch64 aarch64 GNU/Linux

$ head -n 3 /etc/os-release
PRETTY_NAME="Ubuntu Kinetic Kudu (development branch)"
NAME="Ubuntu"
VERSION_ID="22.10"

$ bash -version | head -n 1
GNU bash, バージョン 5.2.0(1)-release (aarch64-unknown-linux-gnu)

ログイン中のユーザの所属グループを変更しても直ちに設定が反映されない

実際に Linux 環境を使って検証してみます。

準備 : sudo 実行可能なテストユーザーを作成

最終的に以下のようなユーザーgenzouwを作成します。

  • ユーザー : genzouw
  • グループ : genzouw
  • セカンダリグループ : sudo

以下のコマンドを順番に実行していきます。

# 現在操作中のユーザーはroot
$ id
uid=0(root) gid=0(root) groups=0(root)

# ユーザーを作成
$ useradd -m -s /bin/bash genzouw

# ユーザーを sudo グループに追加
$ usermod -a -G sudo genzouw

# 適当なユーザーを作成しておく (何でもよいが、ここではhelloとしました)
$ passwd genzouw
新しい パスワード:
新しい パスワードを再入力してください:
passwd: パスワードは正しく更新されました

# ユーザーの設定を確認
$ id genzouw
uid=1000(genzouw) gid=1000(genzouw) groups=1000(genzouw),27(sudo)

上記のコマンドを実行すると、genzouwユーザーが作成されました。

sudo 実行可能なユーザーでセカンダリグループを変更

今度は genzouw ユーザーでセカンダリグループを追加してみます。

何でもいいで www-data グループをセカンダリグループに追加してみます。

# 一旦 genzouw ユーザーにログイン
$ su - genzouw

# genzouw ユーザーで実行
genzouw:~$ sudo usermod -a -G www-data genzouw

上記のコマンドを実行すると、genzouw ユーザーのセカンダリグループに www-data グループが追加されました。

この状態で id コマンドを実行すると、以下のようになります。

genzouw:~$ id
uid=1000(genzouw) gid=1000(genzouw) groups=1000(genzouw),27(sudo)

先程セカンダリグループに追加したはずの www-data が見つかりません。

これを解消するための方法としてよく知られているのは、genzouw ユーザーをログアウトして再度ログインすることです。

# genzouw ユーザーで実行
genzouw:~$ exit

再度ログインした後、id コマンドを実行すると、以下のようになります。

$ su - genzouw

genzouw:~$ id
uid=1000(genzouw) gid=1000(genzouw) groups=1000(genzouw),27(sudo),33(www-data)

今度は www-data グループが表示されました。

このように、セカンダリグループを追加した後は、ログインしなおす必要があります。

ログインせずにセカンダリグループへのグループ追加を反映する方法

Linux では、newgrp コマンドを使用することで、ログインせずにセカンダリグループへのグループ追加を反映できます。

先ほどログインした操作の手前の状態まで戻ってみます。

genzouw:~$ id
uid=1000(genzouw) gid=1000(genzouw) groups=1000(genzouw),27(sudo)

次に、newgrp コマンドを使用して、www-data グループを追加します。

genzouw:~$ newgrp www-data

id コマンドを実行すると、以下のようになります。

genzouw:~$ id
uid=1000(genzouw) gid=1000(genzouw) groups=1000(genzouw),27(sudo),33(www-data)

今度は www-data グループが表示されました。

newgrp を使ったときの問題点

一見便利そうな newgrp コマンドですが、注意しなければならないことがあります。

今回 newgrp コマンドを使用して www-data グループへの追加が直ちに行えたのは、 genzouw ユーザーが既に www-data に所属していたためです。

もし所属していないグループを指定した場合には、パスワードの入力を求められます。

# 所属していないグループを指定
genzouw:~$ newgrp staff
Password:
newgrp: Permission denied

また、仮にパスワードを知っていたとしても newgrp コマンドを使用してグループを追加した場合、次回ログインしたときには追加したグループが解除されてしまいます。

更に、 newgrp コマンドの実行が成功すると、サブプロセスで新たにログインし直されるため、 exit しても同じようなシェルが表示されます。

# exit してみる
genzouw:~$ exit
exit

genzouw:~$

まとめ

newgrp コマンドを使用してセカンダリグループの追加を永続的に反映できません。
また、 exit コマンドを実行しても、同じようなシェルが表示されます。
そのため、結局は exit した後、再度ログインし直すのが確かな手順となります。

ひとこと

紹介しておきながら、ネタエントリとなってしまいました。

こういう方法もあるよ、ということを知っておくと便利かもしれません。

Bash,CentOS,Linux,Ubuntu