chsh が使えなくてもシェルは変更できる

公開日:
chsh を使わずにデフォルトシェルを変更する方法

レンタルサーバーを使っていて ssh で接続して作業することがあるのですが,セキュリティのためか使えるコマンドがかなり限られていてデフォルトシェルを変更するための chsh コマンドすら使えませんでした… 😢
もちろん /etc/passswd などを直接編集してシェルを変更するなんてことはできるはずもないです.
そこで,今回は (正式にデフォルトのシェルが変更されたわけではないですが,) ログインした時に自動で所望のシェルが起動するように変更していきたいと思います.

今回は bash から zshに変更しますが,他のシェルでも同様なので,適宜置き換えて考えてください.
1. 試したこと はその名の通り試したことをいろいろ列挙していますが,筆者が最善の解だと思っているもの2. まとめ に載せているので,そちらをご覧ください.

1. 試したこと

まずはそもそも zshが使えることを確認しておきます.

$ which /bin/zsh
/bin/zsh
$ zsh
# zsh に切り替わる
$ exit
# bash に戻る

1.1 chsh

お馴染みのシェルを変更するコマンドですが,コマンドがないと言われてしまいます.
レンタルサーバーなので使えないようです…

$ chsh -s /bin/zsh
zsh: command not found: chsh

1.2. /etc/passwd

パスワードなどを管理する場所でも変更できますが,これがいじれたら問題なので当然開けません.

$ cat /etc/passwd
cat: /etc/passwd: 許可がありません

1.3 zshを追記

zshを使うことはできるんだから,ログインした時に自動でzsh命令を実行してシェルを切り替えればいいのではないかということで,~/.bash_profilezshを追記してみます.

$ echo "zsh" >> ~/.bash_profile
$ tail -n 1 ~/.bash_profile
zsh # zsh と追記されていることを確認

これで再度ログインし直してみると ~/.bash_profileが自動で実行されて zshに切り替わっていると思います.
これで,めでたしめでたし 👏 と思ったのですが,ログアウトしようとする時に問題が起きました.

# zsh で作業中
$ exit
# bash に移動
$ exit
Connection to ssh.hoge closed.
# ローカルのシェルに移動

つまり,何が起きているかというと,sshから抜けて作業を終了しようと思って exitを実行したのに,sshbashに移動してしまい,もう一度exitをしないとsshから抜けれないという事態が起こっているというわけです.

まあ,二回打てばいいだけでしょ?という方はこれでも大丈夫ですが,少し面倒なのでもう少し工夫したいと思います.

1.4. zsh+exitを追記

先程はbashから抜けられないということが問題だったので,1.3 の続きで~/.bash_profileにさらにexitを追記してみます.

$ tail -n 1 ~/.bash_profile
zsh # zsh と追記されていることを確認
$ echo "exit" >> ~/.bash_profile
$ tail -n 2 ~/.bash_profile
zsh
exit # 最後に行が zsh, exit になっていることを確認

これで,~/.bash_profilezshの実行が終わった後にexitが実行されるので,自動でsshから抜けてくれるのではないか.

# zsh で作業中
$ exit
Connection to ssh.hoge closed.
# ローカルのシェルに移動

実際に試してみると,確かに一回の exitでローカルのシェルに復帰してくれました 👏
これで,めでたしとしてもいいのですが,~/.bash_profileexitを書くことや余分にプロセスが作られることが気持ち悪かったので,もう少しいじってみました.

1.5. exec zshを追記

zshに移動する時に新しくプロセスを作っているのが問題で,zshからexitしても,bashに戻ってしまうという問題が起きていたので,プロセスを新しく作らないようにすれば良いのではないかということで~/.bash_profileexec zshを追記してみます.
ここで,注意ですが,1.3, 1.4 でもしzshexit~/.bash_profileに追記していたらそれらの行は削除しておいてください.
execコマンドについてはこちらの記事などが参考になると思います.

$ echo "exec zsh" >> ~/.bash_profile
$ tail -n 1 ~/.bash_profile
exec zsh # 最後2行が exec zsh になっていることを確認

これで,再度試してみると,zshで作業を終了するときに exitを1回するだけで,ちゃんとローカルのシェルに戻っています.

# zsh で作業中
$ exit
Connection to ssh.hoge closed.
# ローカルのシェルに移動

これで,今度こそめでたしめでたしです 👏
ようやく満足のいく方法が見つかったのでよかったです.

2. まとめ

1.5. exec zshを追記 で試したようにexec zsh~/.bash_profileに追記するというのが最終的な結論です.
これで,余計なプロセスも生成されず,exitも一回実行するだけでsshから抜けられるようになりました.
デフォルトのシェルを変更したいだけなのに,exec命令のプロセスの話まで出てきてコンピュータは奥が深いですね… 😅

コメントを残す

メールアドレスが公開されることはありません。

CAPTCHA