実はssh接続が可能なのでログインも出来るレンタルwebサーバーのXserverでzshを使いたかったので悪戦苦闘のメモ書き。
Xserverの標準shellはbashですが、最近、手持ちの環境はほぼzshに移行し設定も共通化している関係で、提供されているbashではどうも使い勝手が慣れなくなってきたので、zshに移行します。
まず、依存関係の確認を…。検索した結果では特に出てこないので、buildしながら確認しました。自分の環境ではcursesのみ不足しているとのことで、ncursesを先だってインストールします。
ローカルインストールのディレクトリ配置方針
インストール先の配置は自前であれば/usr/localにでも入れておけば良いんですが、そこに書き込み権限はないため、ホームディレクトリ以下に配置します。
綺麗に各ソフトウェアを混在させて実行ファイル、ヘッダー、ライブラリなどを混在して配置できれば楽ちんなのですが、アンインストールやver. upの際のまぜこぜなどが困るので”~/opt/”以下にパッケージ単位でインストールしています。
今回であれば、ncursesは”~/opt/ncurses-6.5″、zshは”~/opt/zsh”に配置されます。このような配置でも、zshであれば実行ファイルへのpathは簡単に通せるので問題はありません。
なお、この記事中ではユーザー名をhogehogeにしているので、適宜、書き換えてください。一部、~や$HOMEで書き換えると意図しない動作になる場合があります。
ncurcesのインストール
今現在、最新のncursesはncurses 6.5でした。調べていると、以前は5.9以下でないとzshがbuild出来ないと言う話もありましたが、特に問題なく使えております。
ncursesはGNUで配布されているので近所のGNUミラーサイトからとってくるも良し、巨大ファイルでもないのでGNU公式配布[https://ftp.gnu.org/gnu/ncurses/ncurses-6.5.tar.gz]からとってくるも良し。
curlもwgetもサーバーにインストールされているので下記の通り。
$ wget https://ftp.gnu.org/gnu/ncurses/ncurses-6.5.tar.gz
$ tar xzf ncurses-6.5.tar.gz
(./ncurses-6.5以下にソースが展開されます)
$ cd ./ncurses-6.5
$ ./configure --prefix=/home/hogehoge/opt/ncurses-6.5 --without-ada --without-manpages --with-shared --with-normal --enable-ext-colors
…
$ make -j
$ make install
ここで注意すべきことは、POSIX thread ライブラリに対応される”–with-pthread”オプションがあるのですが、コレを有効にするとzshがbuildできません。
ncursesはbuildをすると、多バイト文字非対応(以前のdefault)であればncursesが、多バイト対応であればncurseswが、POSIX thread対応であればncursestが、多バイト文字・POSIX thread対応であればncursestwがbuildされます。zshがbuild出来るのはncursesかncurseswのみです。同時に複数のbuildは作ってくれないので複数入れたい人は複数回buildしてインストールしてください。勝手にインストール先にncurses(|w|t|tw)なフォルダを作って分割統治してくれます。
zshのインストール
zshのインストールですが、本来であればログインシェルに使うようなプログラムの場合は静的リンク(その実行ファイル一つで動く)が準備されるべきという老害思考の持ち主なんですが、xserverにはlibc.aが無いようなので動的リンクで作成します。
現在のzshの最新バージョンは5.9であり、公式サイト[https://www.zsh.org/pub/zsh-5.9.tar.xz]からDLしました。
$ wget https://www.zsh.org/pub/zsh-5.9.tar.xz
$ tar -Jxf zsh-5.9.tar.xz
(./zsh-5.9以下にファイルが展開されます)
$ cd ./zsh-5.9
$ ./configure --prefix=/home/hogehoge/opt/zsh --enable-cflas=" -I/home/hogehoge/opt/ncurses-6.5/include" --enable-cppflags="-I /home/hogehoge/opt/ncurses-6.5/include" --enable-ldflags="-L/home/hogehoge/opt/ncurses-6.5/lib -Wl,-rpath,/home/hogehoge/opt/ncurses-6.5/lib" --enable-multibyte
…
$ make -j
$ make install
$ ldd ~/opt/zsh/bin/zsh
linux-vdso.so.1 => (0x00007ffcf3bb9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f6fa3557000)
libncursesw.so.6 => /home/hogehoge/opt/ncurses-6.5/lib/libncursesw.so.6 (0x00007f6fa32dd000)
librt.so.1 => /lib64/librt.so.1 (0x00007f6fa30d5000)
libm.so.6 => /lib64/libm.so.6 (0x00007f6fa2dd3000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6fa2a05000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6fa375b000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f6fa27e9000)
ポイントは –enable-ldflags=”-L(略) -Wl,-rpath,/home/hogehoge/opt/ncurses-6.5/lib” の部分です。実行時にlinkerが共有ライブラリの実体を検索しなくてはいけないが、非標準的な場所に共有ライブラリの実体が置かれているため実行時に見つけられずに実行できません。それに対して、プログラム内に共有ライブラリの実際の場所を参照するパスを書き込んでおくオプションを付加しています。
もう一つの方法としては、環境変数 LD_LIBRARY_PATH
に登録することで実行時の検索ディレクトリに含めることは出来るのですが、今後、ログインシェルにしてしまうとその環境変数を設定できる場所が無いので…(後述のsshのremotecommandオプションを使った擬似的な方法であれば、~/.bash_profileで設定することで対応が可能です。)
buildしたzshをログインシェルにする
普通の環境であれば/usr/bin/chshでログインシェルを変更するのですが、まずそれを実行する権限が無い。そして、出来たとしてもイレギュラーなインストールをしているshellを復旧作業ができないアカウントのログインシェルにして、エラーでログイン出来なくなったとしたら詰むのでそもそもオススメしない。という事で、他の方法を考えます。
Xserverへのログインはsshで行っています。そこで、自動でzshを起動してそこに接続する、という事で擬似的なログインシェルにしてしまいます。
.ssh/configの設定ファイルを以下のように書き換えます。
Host xserver_zsh
(略)
RequestTTY force
RemoteCommand /home/hogehoge/opt/zsh/bin/zsh
これで、ログイン後zshが立ち上がってはいますが、動作としてはログインシェルである/bin/bashが起動しそこでzshが実行されているだけですので、環境変数SHELLが/bin/bashとなっています。その辺で切り分けるスクリプトは誤動作を起こすと思われますので注意してください。
コメント