~/.ssh/config をカスタマイズする
半年前くらいから~/.ssh/config
を使い始めました.
今のところ使っていて便利だなと思った機能を紹介します.
ホスト情報
example.comにuserで秘密鍵~/.ssh/id_rsa_exampleを使って接続するとき,毎回
ssh user@example.com -p 22 -i ~/.ssh/id_rsa_example
と書くのは面倒です.
ここで~/.ssh/config
に
Host example HostName example.com User user Port 22 IdentityFile ~/.ssh/id_rsa_example
と書くと
ssh example
で簡単に接続できるようになります.
多段ssh
ホスト情報が省略できるだけでも十分便利なのですが,例えば家の環境に接続したいときは外向けに解放しているゲートウェイサーバーを経由して接続しなければなりません.
しかしいちいちゲートウェイサーバーにsshしてからローカルマシンにsshするのは手間がかかります.
そこで
Host home HostName 192.168.10.10 User user Port 22 IdentityFile ~/.ssh/id_rsa_home ProxyCommand ssh -W %h:%p gateway # %h -> host, %p -> port Host gateway HostName home.net User user Port 2222 IdentityFile ~/.ssh/id_rsa_gateway
という風に書いてやると,ssh home
はgateway
ホスト経由でローカルネットワークの192.168.10.10
に接続してくれます.
2段以上のときも,
Host home_1 HostName 192.168.10.11 User user Port 22 IdentityFile ~/.ssh/id_rsa_home_1 ProxyCommand ssh -W %h:%p gateway Host home_2 HostName 192.168.10.12 User user Port 22 IdentityFile ~/.ssh/id_rsa_home_2 ProxyCommand ssh -W %h:%p home_1
という具合に書けばremote -> gateway -> home_1 -> home_2
のような接続が
ssh home_2
を叩くだけで行えます.
ワイルドカード
家にマシンが増えてくると,各々のマシンに対してリモートから接続するための設定と家のネットワークから直接接続する設定を書く必要が出てきます.
Host home_1 HostName 192.168.10.11 User user Port 22 IdentityFile ~/.ssh/id_rsa_home_1 ProxyCommand ssh -W %h:%p gateway Host home_1_local HostName 192.168.10.11 User user Port 22 IdentityFile ~/.ssh/id_rsa_home_1 Host home_2 HostName 192.168.10.12 User user Port 22 IdentityFile ~/.ssh/id_rsa_home_2 ProxyCommand ssh -W %h:%p gateway Host home_2_local HostName 192.168.10.12 User user Port 22 IdentityFile ~/.ssh/id_rsa_home_2 . . .
という具合にリモート用とローカル用で分けても良いのですが,同じ記述が複数回出てくるのはちょっと不格好です.
~/.ssh/config
のHostにはワイルドカードを指定することができて,これにマッチしたHostに適用されます.
例えば,
Host *_via_home ProxyCommand ssh -W %h:%p gateway
と書くとssh ~~~~_via_home
は必ずgateway経由で接続されます.
これを利用して,
Host home_1* # 末尾に*を付けないとマッチしません HostName 192.168.10.11 User user Port 22 IdentityFile ~/.ssh/id_rsa_home_1 Host home_2* HostName 192.168.10.12 User user Port 22 IdentityFile ~/.ssh/id_rsa_home_2 Host *_via_home ProxyCommand ssh -W %h:%p gateway
と書いておくと
ローカル: ssh home_1
リモート: ssh home_1_via_home
とするだけで簡単に入れるようになります.(ただしsshコマンドのホスト補完が効かなくなります)
多段SSHの場合
どうやらうまく動かないようです.
Host *via_home_0* ProxyCommand ssh -W %h:%p gateway Host *via_home_1* ProxyCommand ssh -W %h:%p home_1
と書いておいて
ssh home_2_via_home_1_via_home_0
でremote -> gateway -> home_1 -> home_2
な接続ができるかと思ったのですが,home_2_via_home_1
までの時点でssh -W 192.168.10.12:22 home_1
が実行されているためvia_home_0
部分が完全に無視されています.
多段SSHの時はおとなしく書いたほうが良さそうです…(もしどなたか知見ありましたら教えて下さい)