Posted at

.ssh/configもDRYで書きたい

More than 3 years have passed since last update.


結論

これが

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-1hoge-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以下にプロジェクト単位などで設定ファイルを分けて管理することができます。