Posted at

SSHでいつもやる設定 (ControlMaster / Bash補完)

More than 1 year has passed since last update.


ControlMaster

SSHコネクションを束ねて使いまわす機能です。1ホストに対して多量のSSHコネクションを張る場合や、コマンドを実行する場合効果が現れます。


  • 接続済みの相手への接続時間が減る

  • TCPセッション数が減る


~/.ssh/config

Host *

ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 10


速度計測

$ # 1. 最初の接続なので時間がかかる

$ time ssh hostname date
Wed Nov 30 10:40:55 JST 2016

real 0m0.508s
user 0m0.016s
sys 0m0.047s

$ # 2. セッションが残っているので、高速に接続できる
$ time ssh hostname date
Wed Nov 30 10:40:58 JST 2016

real 0m0.089s
user 0m0.000s
sys 0m0.031s

$ # 3. ControlPersistで指定した10秒を経過したので、セッションは消えている
$ time ssh hostname date
Wed Nov 30 10:41:16 JST 2016

real 0m0.506s
user 0m0.016s
sys 0m0.063s


参考: OpenSSHのセッションを束ねるControlMasterの使いにくい部分はControlPersistで解決できる - Dマイナー志向


Bash Completion

Bashでの強力な補完をサポートする bash_completion では、以下に記載のあるホスト名に対してSSHコマンドなどの補完を行います。


  • ~/.ssh/config

  • /etc/hosts

  • ハッシュ化されていない ~/.ssh/known_hosts

上2つを手入力で入れるのは現実的ではないように感じます。3つ目の機能を使用することにより、今まで接続したホストに対して補完が効くようになります。

ただ最近のOpenSSHでは、標準の設定が HashKnownHosts yes となっています。なので、 known_hosts からホスト名を列挙することが出来ません。鍵と known_hosts が漏れた際に攻撃のリスクを最小限にするためだと思われます。


~/.ssh/config

Host *

User ubuntu
HashKnownHosts no

このように設定すると、新しい接続先に対してはハッシュ化されずに記録されるようになります。今までに接続したことが有るホストもハッシュ化を解除したい際は、 known_hosts の該当行を削除するのが手軽です。

$ ssh-keygen -R hostname


以上の設定を全て書いて、自分はこのような設定を使用しています。Ubuntuマシンに接続する場合が多く、接続先が主にプライベートネットワークで、ControlMasterによって影響を受ける機能を使用していないためこのように設定しています。

Host *

User ubuntu
ControlMaster auto
ControlPath ~/.ssh/mux-%r@%h:%p
ControlPersist 10
HashKnownHosts no