再ログインせずにログイン中ユーザの所属グループの変更を反映する方法
はじめに
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
した後、再度ログインし直すのが確かな手順となります。
ひとこと
紹介しておきながら、ネタエントリとなってしまいました。
こういう方法もあるよ、ということを知っておくと便利かもしれません。
ディスカッション
コメント一覧
まだ、コメントがありません