ControlMaster
SSHコネクションを束ねて使いまわす機能です。1ホストに対して多量のSSHコネクションを張る場合や、コマンドを実行する場合効果が現れます。
- 接続済みの相手への接続時間が減る
- TCPセッション数が減る
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
が漏れた際に攻撃のリスクを最小限にするためだと思われます。
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