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
で上の物が入る様になっています。
追記ここまで

