sshなどで他のサーバーに行く時、 通常それぞれの環境で.bashrc等を用意して 環境設定を行いますが、 余り使わない様な環境に対してちょっとした設定だけ 持っていきたい、と思ったことがあるかもしれません。
そんな時に使えるsshrc
というコマンドについて。
sshrc
sshrc
はssh
時に接続元にある設定ファイルを接続先に持っていって
環境設定出来る様にしてくれるコマンドです。
コマンド自体はシェルスクリプトで作られていて100行も無いので 見てみるとやっていることがだいたい分かると思います。
同じレポジトリにmoshrc
というmosh
時に設定を持っていくコマンドもあります。
sshrcをインストール
インストールはMac + Homebrewなら
$ brew install sshrc
Ubuntuなどであればapt-getで
$ sudo add-apt-repository ppa:russell-s-stewart/ppa
$ sudo apt-get update
$ sudo apt-get install sshrc
stow-getを使ってもインストールできます。
$ stow-get install sshrc
これらのコマンドでmoshrc
も同時にインストールされます。
それらが使えない環境では
レポジトリにあるsshrc
スクリプトをPATHの通ったディレクトリに入れればOK。
$ wget https://raw.githubusercontent.com/Russell91/sshrc/master/sshrc
$ chmod +x sshrc
$ sudo mv sshrc /usr/local/bin #or anywhere else on your PATH
moshrc
も使いたい場合は同様にmoshrc
についても行います。
ちょっと注意が必要なのは Homebrewやapt-getなどでインストールされるのはリリースになっているもの(0.6.1)で レポジトリのHEADのものとはちょっと違います。 (stow-getはHEADを持ってきます。)
最新のものが欲しい場合には
$ brew install sshrc --HEAD
などとするか上にある様に直接ファイルを取ってくる必要があります。
違いはHEADにあるssh_parse
という関数が無いことで
特に引数を使った通常のログイン以外のことをしようとする時に
問題が出る可能性があります。
まあ、そういった場合は通常のssh
を使えば良いのですが、
ssh
コマンド自体をsshrc
にaliasしたりしたい場合にはHEADの方を使った方が良いです。
また、sshrc
を使うにはローカル、リモートサーバー両方にopenssl
がインストールされている必要があります。
もしインストールされてない場合は
$ brew install openssl
or
$ sudo apt-get install openssl
or
$ stow-get install openssl
or 直接openssl
をインストールする必要があります。
sshrcの使い方
まず送りたい設定を書いたファイル~/.sshrcを作ります。 (このファイルが無いとエラー終了します。)
とりあえず、
1
|
|
とただecho
するだけのファイルを作ってsshrc
を使ってみます。
sshrc
はssh
のラッパースクリプトの様になっていて
引数などはssh
と全く同じです。
[ example.orig.com ]$ sshrc example.dest.com
welcome
[ example.dest.com ]$
と言った具合に作った設定ファイルが実行される事が分かります。
また、~/.sshrc.dというディレクトリを作り、 ここにファイルを入れておくとそのファイルをリモートサーバーに送ることも出来ます。 (どう読み込むかなどは~/.sshrcで設定する。)
sshrcがやってること
スクリプトの中をちょっと見てみると次の様なことをやっている事が分かります。
ssh -t example.com command
の形でログインせずにコマンドを送るsshを行う。- 最終的にコマンド実行の形でbashを立ち上げたいので
-t
の強制仮想端末割当オプションが必要。
- 最終的にコマンド実行の形でbashを立ち上げたいので
- まずリモートサーバーにテンポラリーなディレクトリを作って
SSHHOME
という値にパスを入れる。 - このディレクトリは
trap
を使って終了時に削除する様にする。 - sshrcのスクリプト自身のコピーを
$SSHHOME
に作る。 -
$SSHHOME
に以下の様な内容のsshrc.bashrcを作成:if [ -r /etc/profile ];then source /etc/profile fi if [ -r ~/.bash_profile ];then source ~/.bash_profile elif [ -r ~/.bash_login ];then source ~/.bash_login elif [ -r ~/.profile ];then source ~/.profile fi export PATH=$PATH:$SSHHOME source $SSHHOME/.sshrc;
$SSHHOME
にローカルの.sshrcや.sshrc.dの中身をコピー。bash --rcfile $SSHHOME/sshrc.bashrc
で上記のsshrc.bashrc
を読み込むbashを立ち上げる。
コマンドを送る形のssh
ですが、結果的にbash
を立ち上げるので
通常のログインと同じ様な形になります。
Bash立ち上げ時に最後に.sshrcを読み込んでいるので これによりローカルで作った.sshrcが反映される事になります。
また、$SSHHOME
がPATHに加えられ、ここにsshrc
スクリプト自身がコピーされていることから、
このリモートサーバーにおいてもsshrc
コマンドを使える様になります。
さらに、$SSHHOME
が予め環境変数として指定されている場合、
sshrc
の中でもそこをHOMEとしてみて.sshrcなどを読み込むため、
このリモートサーバーからさらにsshrc
する際には元のサーバーにあった.sshrc
がそのままさらなるリモートサーバーに持っていかれる事になります。
ので、二段階に渡りsshrc
しようとする時、中継にある~/.sshrcは反映されないので
ちょっと注意が必要です。必要ならunset SSHHOME
などします。
ローカルにあるファイルの内容などを送る様になっていますが、
この際に暗号化して送っていてここでopenssl
を使っています。
(なのでローカル、リモート両方に必要。)
sshrcがやってることを単純化
例えばある環境変数だけをリモートで設定したい、というのであれば、
$ ssh -t example.com "export VAL=xxx";bash"
とかすればVAL
という環境変数を持った状態でリモート作業が出来ます。
ただし、この場合はbash
では~/.bashrcを呼び~/.bash_profileは呼ばれません。
もし、~/.bash_profileでログイン時に必ず必要な設定があり~/.bashrcだけではだめな場合には
$ ssh -t example.com "export VAL=xxx";bash --rcfile ~/.bash_profile"
とかすればOK。
値とかがパスワードとかでない限り暗号化する必要もないですし、 簡単な設定だけならこんな感じで直接行うことも可能です。
vimやtmuxといったコマンドの設定
~/.sshrc.dに.vimrc等を入れておくことにより
これをsshrc
で持っていき、
export VIMINIT="let \$MYVIMRC='$SSHHOME/.sshrc.d/.vimrc' | source \$MYVIMRC"
の様にVim立ち上げ時に$SSHHOME
にある.vimrcを読むような設定を
~/.sshrcに書いておけば
リモートでVimを立ち上げる時に行う設定を変える事が出来ます。
TmuxやGNU screen、その他の設定ファイルがあるようなものでも 基本的には~/.sshrcを工夫すればなんでも設定を送る事が出来ます。
VimやTmuxに関してはレポジトリのREADMEに詳しい例が載っています。
まとめ
ssh
を使い複数の環境で作業する時に、それぞれの環境で設定が違うと
使用感が下がりますが、
sshrc
を使えばリモート側の設定ファイルを変えなくても
行いたい設定をローカルに書いておくだけで直接リモートで反映する事が可能です。
ただし、実際に情報を送るわけで毎回大量の情報を送るのは逆にssh
の使用感を下げるので
送るのは最小限の設定だけにするべきです。
実際、sshrc
では送るファイルの合計サイズが最大64kBまでとなっています。
(必要なら数字書き換えればすぐに変更できますが。)
ちょっと見てみたら自分の.bashrcが20kB、.vimrcが48kBでこれら合わせると64kB超えます。 (そもそもちょっと大きすぎるか。。。)
そのようなフルな設定に関してはdotfilesを使ったような管理を 行うべきです。
sshrc
はBash専用になっていますが、
簡単なスクリプトなので必要であればZshに書き換えて使うことも出来ると思います。
追記: 2018/02/01
moshrc
を使う時も同じように.sshrc
等の設定が持っていかれるわけですが、
この際スクリプトとしてはmoshrc
だけがコピーされます。
mosh
であるサーバーに入った後、さらに他のサーバーに移動する時は
mosh
よりもssh
を使うことが多いです。
この場合にsshrc
が無いとちょっと悲しいので
moshrc
をちょっといじっってsshrc
も送れるようにしました。
Pull request出してますがとりあえずはForkした上のレポジトリから使えます。
Homebrewでも
$ brew install rcmdnk/rcmdnkpac/rcmdnk-sshrc
とするとインストールできます。
stow-getなら
$ stow-get install sshrc
で上の物が入る様になっています。
追記ここまで