.ssh/configホストに複数のホスト名エントリがありますか?

.ssh/configホストに複数のホスト名エントリがありますか?

自宅にいないときにホームネットワーク上のコンピュータにSSH経由で接続できるように、SSHとルーターのポート転送を設定しました。現在、私のファイルには2つのエントリがあります。.ssh/config1つはホームネットワークにいるときのための項目、もう1つはホームネットワークにいないときのための項目です。

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

これはうまくいきますが、自分自身が仕事をより簡単にできるかどうか疑問に思います。最初のホスト名エントリが失敗した場合は、2番目のホスト名エントリに置き換えられるように、複数のホスト名エントリを一覧表示する方法があります。

Host mycomputer
  HostName 192.168.X.X
  HostName my.no-ip.dynamic

これにより、まず自分のローカルネットワーク上のホストに接続しようとし、そのホストが存在しない場合は、IPを持たない動的ホスト名を使用して接続を試みます。両方のホスト名を入力しようとしましたが、ssh mycomputer何もしないようにブロックのみを実行しました。

鍵を使用するためにパスワード認証をオフにしたため、ホームネットワークにいないときに誤ってローカルネットワーク上のコンピュータに接続すると、パスワードは機能しません。

最初のホスト名が機能しない場合に試みる代替ホスト名を指定できますか?

答え1

醜いですが、私の考えではできるこれを行うには、ポートノッキングの終了ステータス基準を使用しますexecMatch

Host mycomputer
  Match exec "nc -z 192.168.1.11 %p"
    HostName 192.168.1.11
  Match !exec "nc -z 192.168.1.11 %p"
    HostName my.no-ip.dynamic

これが「あなたの」ホームネットワークにあることを実際に知らせるわけではありません。これは、同じアドレス/ポートでリッスンするサービスがある同じアドレス範囲を持つプライベートLANセグメントにあることです。

答え2

それが私が使う方法です。

Match host mycomputer exec "nc -w 1 -z 192.168.1.11 %p"
    HostName 192.168.1.11
Match host mycomputer # fallback
    HostName my.no-ip.dynamic
Host mycomputer
    # ... other configs

Host not-my-computer
# ... other configs

ssh_configには、インデントされたブロックのようなものはありません。 matchステートメントを特定のホストに制限するには、条件全体を説明する必要があります。

nc(connection timeout 1s) オプションを提供することで、長い待ち時間を回避でき、-w 1次の動作を利用して複数の呼び出しを回避できます.nc

一致には
条件付きブロックが導入されます。 「一致」行のすべての条件が満たされると、次の行のキーワードは、別の「一致」行またはファイルの最後まで、構成ファイルのグローバルセクションで設定されたキーワードをオーバーライドします。条件を満たす複数の一致ブロックにキーワードが表示される場合、そのキーワードの最初のインスタンスのみが適用されます。

https://www.freebsd.org/cgi/man.cgi?sshd_config(5)

答え3

HostNameいいえ。 1つの項目に複数のが指定されている場合、Host最初の項目のみが承認されます。

$ grep -A5 Host .ssh/config
Host test
   HostName fake.tld.xyzzy
   HostName real.example.com
   HostName 127.1.2.3
   User username
$ ssh test
ssh: Could not resolve hostname fake.tld.xyzzy: Name or service not known

答え4

予約されたもの:
@reboot ~/.ssh/scripts/distant_check.sh

~/.ssh/scripts/distant_check.sh:
ping -c1 [ローカルサーバーIP]
もし[$? -eq 0];
cp ~/.ssh/config_local ~/.ssh/config
その他
cp ~/.ssh/config_distant ~/.ssh/config
フィリピン諸島

関連情報