rcmdnk's blog
Last update

20180131_sshrc_200_200

sshなどで他のサーバーに行く時、 通常それぞれの環境で.bashrc等を用意して 環境設定を行いますが、 余り使わない様な環境に対してちょっとした設定だけ 持っていきたい、と思ったことがあるかもしれません。

そんな時に使えるsshrcというコマンドについて。

sshrc

sshrcssh時に接続元にある設定ファイルを接続先に持っていって 環境設定出来る様にしてくれるコマンドです。

コマンド自体はシェルスクリプトで作られていて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を作ります。 (このファイルが無いとエラー終了します。)

とりあえず、

.sshrc
1
echo welcome

とただechoするだけのファイルを作ってsshrcを使ってみます。

sshrcsshのラッパースクリプトの様になっていて 引数などはsshと全く同じです。

[ example.orig.com ]$ sshrc example.dest.com
welcome
[ example.dest.com ]$

と言った具合に作った設定ファイルが実行される事が分かります。

また、~/.sshrc.dというディレクトリを作り、 ここにファイルを入れておくとそのファイルをリモートサーバーに送ることも出来ます。 (どう読み込むかなどは~/.sshrcで設定する。)

sshrcがやってること

スクリプトの中をちょっと見てみると次の様なことをやっている事が分かります。

  • ssh -t example.com commandの形でログインせずにコマンドを送るsshを行う。
    • 最終的にコマンド実行の形でbashを立ち上げたいので-tの強制仮想端末割当オプションが必要。
  • まずリモートサーバーにテンポラリーなディレクトリを作って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

で上の物が入る様になっています。

追記ここまで

Sponsored Links
Sponsored Links

« Bash/Zshで関数やaliasを無視してオリジナルのコマンドを使う方法 Google Chrome上でマウスカーソルが消えてしまう場合の対処法 »

}