はじめに
筆者は今まで
「学内からはProxyCommandなしで入れるけど、学外からは中継サーバーを経由しなければいけないのでProxyCommandが必須!」
という状況で、かつ学内から中継サーバーにアクセスすることができなかったので、~/.ssh/config
の中身を別のホストとして分けて書いていました。
- 例(hogeが目的サーバー、hogehogeが中継サーバー)
Host hoge-in
HostName XXX.XXX.XXX.XXX
IdentityFile ~/.ssh/id_hoge
User hoge
Host hoge-ex
HostName XXX.XXX.XXX.XXX
IdentityFile ~/.ssh/id_hoge
User hoge
ProxyCommand ssh -XC -W %h:%p hogehoge
Host hogehoge
HostName YYY.YYY.YYY.YYY
IdentityFile ~/.ssh/id_hoge
User hoge
このようにすると、いる場所によって使用するホスト名が変わります。
これを回避し、共通のホスト名でsshできるようにするやり方を見つけましたのでメモします。
環境
- MacOS 10.15.7 Catalina
❯ ssh -V
OpenSSH_8.1p1, LibreSSL 2.7.3
やり方
~/.ssh/config
において、Matchオプションを用いて判別をしてあげれば良いです。
Host hoge
HostName XXX.XXX.XXX.XXX
IdentityFile ~/.ssh/id_hoge
User hoge
Match originalhost hoge exec "! ping -t 1 -c 1 ZZZ.ZZZ.ZZZ.ZZZ > /dev/null"
ProxyCommand ssh -XC -W %h:%p hogehoge
Host hogehoge
HostName YYY.YYY.YYY.YYY
IdentityFile ~/.ssh/id_hoge
User hoge
ここでoriginalhost
はコマンドラインで入力したhostnameに対応します。
つまり、
❯ ssh hoge
としたときのhoge
に対応します。
また、ZZZ.ZZZ.ZZZ.ZZZ
は学内サーバーのみからアクセスすることのできるサーバーを指定します。
よって、これらは何をやっているかというと、
Match
以下の内容は
originalhost = hoge
かつ
-
ZZZ.ZZZ.ZZZ.ZZZ
にping
を飛ばせない状況である
これらを満たすとき、以下の内容(今の場合はProxyCommand
)を実行せよ
ということです。
こうすることによって、学内/学外によらず
❯ ssh hoge
でアクセスすることができます。
注意・メモ
- このやり方はsshアクセスのたびに
ping
を飛ばすということに注意してください。 - ダブルクォーテーションの中身は好きなコマンドを実行することができます。
(例えばssh configでの条件分岐ではWi-FiのSSIDをチェックして、特定のSSIDのときには違うホストにアクセスするということをやっています。) -
Match
文は順番に依存します!基本的に上から下に実行されることに注意してください。
(これをうまく使えば、特定の条件のときだけパラメーターを上書きするといったことも可能です。)