レンタルサーバーを使っていて 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_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
命令のプロセスの話まで出てきてコンピュータは奥が深いですね…