🙅‍♂️

chsh で sudo してはいけない

2021/04/04に公開

厳密には、してはいけないというより、意図した挙動にならない。

chshsudo をつけるとどうなるか

たとえば、デフォルトシェルを (Bash から) Zsh に変更する際には、以下のコマンドを実行する。

Shell
chsh -s $(which zsh)

このとき、パスワードを求められるので、最初から sudo つけておけば良いんじゃないかと安易な考えに至った。

Shell
sudo chsh -s $(which zsh)

しかし、これだと意図した挙動にならない。

sudo をつけたことにより root で実行されるので、root のデフォルトシェルが変更されてしまったことになる。

一般ユーザだと、Zsh に変更されていない。

Shell
echo $SHELL
/usr/bin/bash

代わりに root で Zsh に変更されてしまっている。

Shell
su -
echo $SHELL
/usr/bin/zsh

まあ、考えてみれば当たり前なのだが、パスワードを求められる → sudo をつけておけば (/etc/sudoers の設定次第で) パスワードをスキップできる、という発想になっていた。

しかし、root のデフォルトシェルを変更してしまうのは意図していないので、chsh を実行するときは sudo をつけずにパスワードを入力しよう。

exec -l $SHELL では反映されない

ちなみに、chsh を実行したあとは、シェルを再起動する必要があるが、以下のコマンドではうまくいかない。

Shell
exec -l $SHELL

これも考えてみれば当たり前だが、この時点ではまだデフォルトシェルが変更される前なので、$SHELL の中身は前のシェルのままだ。

なので、変更を反映させるには、以下のように明示的に変更後のシェルのパスを指定するか、exit してもう一度入り直す必要がある。

Shell
exec -l $(which zsh)
GitHubで編集を提案

Discussion