アクセスポイントによってSSHの設定を切り替えるスマートな方法
自宅LAN内のサーバにSSHするとき、LAN内からならローカルIPアドレス、
外からならグローバルIPアドレス(あるいはホスト名)でアクセスする必要があったりします。
.ssh/config
に別々の設定を書いても良いですが、同じ名前でSSHしたいときの設定方法です。
Matchによる条件分岐
OpenSSH 6.5以降ではconfigのMatch
キーワードで設定を分岐させることができます。
分岐条件には外部コマンドを使うこともでき、Match exec "cmd"
のように書きます。
詳しくはman ssh_config
を見てください。
自宅LANかどうかの判定
iwconfig
コマンドでSSIDを取り出せるので、 grep
などでマッチさせれば簡単に判定できます。
iwconfig 2>/dev/null | grep -q ’ESSID:"my-ssid"’
echo $?
ダブルクオート("
)をどうにかする
上の判定コマンドをそのまま Match exec
に書けば良さそうなのですが、
コマンド全体を"
で囲まねばならず、その中に"
を含めることができません。
そこで、シェルのエスケープシーケンスを使って"
をgrepの引数に与えるようにします。
Match host myserver exec "iwconfig 2>/dev/null | grep -q ESSID:$'\x22'my-ssid$'\x22'"
HostName ローカルIPアドレス
また、Match
は複数の条件を1行に書くことができ、左から順に検査されるので、
Match host
で先に接続先名をマッチさせています。
こうすることで、ssh myserver
としたときのみコマンドが実行されるようにできます。
自宅LAN以外でのアクセスの設定
ssh_configはファイルの先頭から順に設定を読んでいき、あとから同じ設定が出てきても上書きされません。 これを利用して、次のように自宅LAN以外での設定を書き加えます。
Match host myserver exec "iwconfig 2>/dev/null | grep -q ESSID:$'\x22'my-ssid$'\x22'"
HostName ローカルIPアドレス
Port 22
Host myserver
HostName グローバルIPアドレス
Port 2222
User myname
ForwardX11 yes
このように共通の設定をHostの方に、自宅LANでのみ有効な設定をMatchに書くことができ、管理もしやすくなります。
これで ssh myserver
という共通のコマンドで、適切なIPアドレス(ついでにポート)で接続できるようになりました。
同じような方法で踏み台サーバの設定も動的に切り替えることもでき、便利に利用しています。
うまく動かない時は……
ssh -v myserver
のように -v オプションをつけて実行すると、configのどのキーワードがマッチしているのか確認することができます。