レンタルサーバーを使っていて 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: chsh1.2. /etc/passwd
パスワードなどを管理する場所でも変更できますが,これがいじれたら問題なので当然開けません.
$ cat /etc/passwd
cat: /etc/passwd: 許可がありません1.3 zshを追記
zshを使うことはできるんだから,ログインした時に自動でzsh命令を実行してシェルを切り替えればいいのではないかということで,~/.bash_profileにzshを追記してみます.
$ 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を実行したのに,sshのbashに移動してしまい,もう一度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_profileでzshの実行が終わった後にexitが実行されるので,自動でsshから抜けてくれるのではないか.
# zsh で作業中
$ exit
Connection to ssh.hoge closed.
# ローカルのシェルに移動実際に試してみると,確かに一回の exitでローカルのシェルに復帰してくれました
これで,めでたしとしてもいいのですが,~/.bash_profileにexitを書くことや余分にプロセスが作られることが気持ち悪かったので,もう少しいじってみました.
1.5. exec zshを追記
zshに移動する時に新しくプロセスを作っているのが問題で,zshからexitしても,bashに戻ってしまうという問題が起きていたので,プロセスを新しく作らないようにすれば良いのではないかということで~/.bash_profileにexec zshを追記してみます.
ここで,注意ですが,1.3, 1.4 でもしzshやexitを~/.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命令のプロセスの話まで出てきてコンピュータは奥が深いですね…