iTermで動くオレオレSSH(接続先による色設定、config分割)

Posted by jolantern on Friday, November 18, 2016

TOC

オレオレSSHを作りたかった

何もSSHを再実装しようというのではなくて、ただ単に便利sshクライアントっぽい挙動をするスクリプトでも組んで楽したいなーと思って、それをやってみたのでその記録である。 なおこれはiTerm2で実行するsshだけを対象にしている。ちょっと変えれば普通のTerminalでも出来るんじゃないかな。

主に追加したかった機能は下記。 - sshの接続先ごとに色を変えたかった - ~/.ssh/configではなくて~/.ssh/conf.d/以下に任意の設定ファイルを置いて設定したかった

なんでこんなことをしたかったか

sshはいろんな時に使う。VPSに繋いでWordpressの構築やるときもあれば、お仕事なシステムのサーバに繋いでmysqlであれしたり、vagrantであれしたり。 そういうことしてる時に一番イヤな汗をかくのは実行するホストを間違えていた場合。接続先からして間違ってるとかならアホか〜〜〜と諦めもつくのだけど、iTermのタブとかウィンドウとかパネルを間違えたときが一番ショックを受ける。

最近一番ヒヤッとしたのは、開発用Vagrantを触ってるつもりだったら本番環境だったとき。全く影響はなかったのだけど、それでもヒヤッとはするものであった。なのでその対策にsshのログイン先によってiTermの色が変わるようにしたかった。

色を変える手法についての記事はたくさんあったのだけど、どれも古かったり、思った動作をしてくれなかったので自分用に書き直した。Fork元はこれ。感謝感謝。

もとのやつ

config設定を分割したいというのは、ただ単に嫌だったのだ。個人のVPSの接続先だとか仕事用のあれこれだのvagrantだので1つのファイルがごちゃごちゃになるのが。 例えばですけど、プライベートなVSPと会社のサーバの設定、分けたくないですか? 他にもすごいたくさんのサーバの管理とかしてるインフラエンジニアの人とか~/.ssh/configがアホみたいにでかくなってるイメージが有るので、分けたい気持ちはどこかにあるはず、と思って探してみたらドンピシャなのがあった。

わたしの.ssh/config運用

なお新しいsshであれば別にこんなのいらない模様。 Is there a way for one SSH config file to include another one?

なんか比較的新しいはずのMacでも6.9とかで非対応だったんでまあいいやーとこのまま公開することにした。

書いたもの

で、書いたのがこれ。

iTermで使うオレオレSSH

使い方は、ダウンロードしてパスの通ってる所においてsshのエイリアスにでも設定してくだされ。

こっからは細かい説明です。 動作原理というか、一応他にも設定すべきことが2つ有ってですね…。

接続先ごとの色の設定

このスクリプトの下記部分で色を変える処理をしている。 後述するsshのconfigファイルの分割の話ともつながるのだけど、 ~/.ssh/config に設定されているHostと同じものを条件に使うといい。

<code class="sh">if [[ "$@" =~ servername ]]; then
  set_term_bgcolor 40 0 0
elif [[ "$@" =~ git ]]; then
  set_term_bgcolor 0 40 0
fi
</code>

ここを増やせばいろんな接続先に対応できる。 このシェルスクリプトをエイリアスに設定してあげるとかすれば接続先によってiTermの背景色が変わるので、オペレーションミスは発生しづらいはずだ。 ちなみにexitで戻ってきたときは色が最後の set_term_bgcolor 0 0 0 で戻る(言い換えればこ こをデフォの色にしておく必要があるはず)のだけど、接続先から一方的に蹴られた場合は戻らな いのであしからず。

~/.ssh/conf.d/*の設定

早い話、nginxとかの設定みたいに分割したいでござる〜〜〜ということだ。 こんな感じの設定を、~/.ssh/conf.d/以下に作ってあげよう。なおディレクトリは無いはずなので作ってくれ。

<code class="sh"><br></br>Host servername
  HostName server.com
  IdentityFile ~/.ssh/id_rsa
  User username
</code>

そんでもって上のスクリプトはconf.d以下のファイルを全部 ~/.ssh/config に上書きしてくれるので、設定ファイルを分けることが出来るという寸法だ。

ただ、sshを叩く度に最新の設定が適用されるのはいいんだけど、1つ気になることが有る。 sshを実行する度にsshのconfigが書き換えられる点。あまりに大量に設定ファイルがあってレスポンス遅いって人は

<code class="sh">cat ~/.ssh/conf.d/* > ~/.ssh/config
</code>

.bashrc とかに書いてあげるといいと思う。

こういうオレオレスクリプトも含めて、dotfilesとか整理したいなー。