
自宅にいないときにホームネットワーク上のコンピュータにSSH経由で接続できるように、SSHとルーターのポート転送を設定しました。現在、私のファイルには2つのエントリがあります。.ssh/config
1つはホームネットワークにいるときのための項目、もう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
醜いですが、私の考えではできるこれを行うには、ポートノッキングの終了ステータス基準を使用しますexec
。Match
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
一致には
条件付きブロックが導入されます。 「一致」行のすべての条件が満たされると、次の行のキーワードは、別の「一致」行またはファイルの最後まで、構成ファイルのグローバルセクションで設定されたキーワードをオーバーライドします。条件を満たす複数の一致ブロックにキーワードが表示される場合、そのキーワードの最初のインスタンスのみが適用されます。
答え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 フィリピン諸島