LoginSignup
6
10

More than 5 years have passed since last update.

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

Posted at

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
6
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
10