.ssh / configホストは複数のHostNameエントリを持つことができますか?


10

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

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

これは機能しますが、自分でもっと簡単にできるかどうか疑問に思っています。複数のHostNameエントリを一覧表示して、最初のエントリが失敗した場合に2番目のエントリにフォールバックする方法があることを望んでいました。

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

最初にローカルネットワーク上のホストへの接続を試み、それが存在しない場合は、no-ip動的ホスト名を使用して接続を試みます。2つのHostNameを入力してみましたが、実行しているssh mycomputerだけでは何もしません。

キーを優先してパスワード認証をオフにしたので、ホームネットワークに接続していないときにローカルネットワーク上のコンピューターに誤って接続しても、パスワードが実行されない場所に移動する危険はありません。

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


unix.stackexchange.com/questions/424755/…も同様で、おそらくポートではなくホスト名に適合させることができます
18

ところで、は.ssh/config特定のプロパティのスクリプトを実行できます。ProxyCommandでできることを知っています。SFからのこのQ&Aに示されているように何かを実行できます-serverfault.com/questions/401233/…
slm

回答:


8

醜いです、ポートノックの終了ステータスの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セグメント上にいるだけです。


1
追加する-w 1必要があったncか、それとも永遠に待つようだった。Match exec "true"最初の一致が失敗した場合は、盲目的に2番目の選択を試すため、2番目の一致がより簡単になる可能性があります。
Corey Ogburn 2018

@CoreyOgburnああはい、私は代替条件を実行するためのより良い方法を考えようとしていました(MatchElse
残念なことに

そのため、このアプローチで問題が発生しました。私はまた、サイトを実行しxyz.comを言うと、私がしようとしたときssh xyz.com、私Match exec "true"と私のリモートホスト名を使用して、私のホームサーバーに私をリダイレクトすることをキャッチ。私はあなたの幹部と試みますが、同じことが起こると思います。
Corey Ogburn 2018

ええ、あなたの使用Match exec... Match !execは他のドメインへのsshを引き起こし、をトリガーしMatch !execてHostNameを書き換えます。
Corey Ogburn 2018

2
つまり、~/.ssh/configインデントを気にする必要がないことがわかりました。特定のコマンドはスコープをリセットします。つまり、新しいホスト行ごとに「以前の行は以前のホスト用で、次の行はこの新しいホスト用です」と表示されます。結局Match、ホストと同じ「スコープのリセット」能力があります。これを説明するために、Host行をMatch Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"ローカルネットワークのすべてのカスタム値に置き換えて定義しました。次に、一致する行を!exec追加し、ネットワークに接続していないときの値をすべて追加しました。これで、すべてのホストで正常に動作します。
Corey Ogburn

2

このように使っています。

Match host mycomputer exec "nc -G 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にはインデントブロックのようなものはありません。一致文を特定のホストに限定する場合は、完全な状態を説明する必要があります。

あなたは長い間待って避けることができnc、それを与えることによって、-G 1(1Sタイムアウト接続)オプションを、あなたは複数の呼び出しを避けるために、次の動作を利用することができますnc

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

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


1

番号; HostName1つの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

それは理にかなっていると思います。入力した場合、ssh mycomputerどのコンピューターに接続しているかがはっきりとわかります。
Corey Ogburn 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.