結論
これが
Host hoge-humidai
HostName hoge.com
User hoge
port 10022
Host hoge-a
HostName 10.15.0.10
User hoge
IdentityFile ~/.ssh/hoge-a
ProxyCommand ssh -W %h:%p hoge-humidai
Host hoge-b
HostName 10.15.0.20
User hoge
IdentityFile ~/.ssh/hoge-b
ProxyCommand ssh -W %h:%p hoge-humidai
Host hoge-c-1
HostName 10.15.0.30
User hoge
IdentityFile ~/.ssh/hoge-c
ProxyCommand ssh -W %h:%p hoge-humidai
Host hoge-c-2
HostName 10.15.0.40
User hoge
ProxyCommand ssh -W %h:%p hoge-humidai
Host hoge-c-3
HostName 10.15.0.50
User hoge
ProxyCommand ssh -W %h:%p hoge-humidai
下記のようになります
Host hoge-humidai
HostName hoge.com
port 10022
Host hoge*
User hoge
Host hoge* !hoge-humidai
ProxyCommand ssh -W %h:%p hoge-humidai
Host *-a
HostName 10.15.0.10
IdentityFile ~/.ssh/hoge-a
Host *-b
HostName 10.15.0.20
IdentityFile ~/.ssh/hoge-b
Host *-c-?
IdentityFile ~/.ssh/hoge-c
Host *-1
HostName 10.15.0.30
Host *-2
HostName 10.15.0.40
Host *-3
HostName 10.15.0.50
詳しく
上記の.ssh/configについて詳しく説明します。
.ssh/configをまとめる際にはHostでのパターンマッチを利用します。
Hostでサポートされているパターンマッチは*, ?, !
の3種類があり、マッチした項目の設定を適用させることができます。
また、最初にマッチしたHostの設定内容はその後にマッチしたHostの設定に上書きされることはありません。
「*」任意の長さの文字にマッチさせる
Host hoge*
User hoge
Host *-a
HostName 10.15.0.10
IdentityFile ~/.ssh/hoge-a
Hostではワイルドカードを使うことができます。
上記のように設定することでhoge
から始まるHostに
User hoge
の設定を反映させることができます。
また、-a
で終わるHostに
HostName 10.15.0.10
IdentityFile ~/.ssh/hoge-a
の設定を反映します。
「hoge-a」は両方にマッチするため、これらの設定が適用されます。
「?」任意の1文字にマッチにマッチさせる
Host *-c-?
IdentityFile ~/.ssh/hoge-c
Host *-1
HostName 10.15.0.30
hoge-c-1
やhoge-c-2
の重複設定を省略するために上記のようにしています。
その際に*-c-?
というパターンを利用することで、-c-
の後に任意の1文字が存在する場合にのみマッチさせることができます。(ナンバリングが2桁を超えたら設定は変えてください)
「!」パターンを否定する
Host hoge* !hoge-humidai
ProxyCommand ssh -W %h:%p hoge-humidai
今回の例のように踏み台サーバ以外にのみ設定を適用したい場合はパターン否定を利用します。
Hostには複数のホスト名やパターンを設定することができます。
上記ではhoge*
のパターンと!hoge-humidai
の2つを設定し、後者は「hoge-humidai」を否定しているため、「hoge」から始まるかつ「hoge-humidai」ではないHostにマッチするようになっています。
その他
alias ssh='cat ~/.ssh/conf.d/*.config > ~/.ssh/config;ssh'
今回の内容とは関係ありませんが、.zshrcや.bashrcなどに上記のコマンドを追加することで、.ssh/conf.d以下にプロジェクト単位などで設定ファイルを分けて管理することができます。