Kann ein .ssh / config-Host mehrere HostName-Einträge haben?

10

Ich habe die Weiterleitung von SSH- und Router-Ports eingerichtet, damit ich SSH in einen Computer in meinem Heimnetzwerk einbinden kann, wenn ich nicht zu Hause bin. Derzeit habe ich zwei Einträge in meiner .ssh/configDatei, einen für den Fall, dass ich in meinem Heimnetzwerk bin, und einen für den Fall, dass ich nicht in meinem Heimnetzwerk bin:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

Das funktioniert, aber ich frage mich, ob ich es mir leichter machen kann. Ich hatte gehofft, dass es eine Möglichkeit gibt, mehrere HostName-Einträge so aufzulisten, dass wenn der erste fehlschlägt, er auf den zweiten zurückfällt:

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

Damit zuerst versucht wird, eine Verbindung zu einem Host in meinem lokalen Netzwerk herzustellen, und wenn dies nicht vorhanden ist, wird versucht, eine Verbindung mit meinem dynamischen Hostnamen ohne IP-Adresse herzustellen. Ich habe versucht, zwei Hostnamen einzugeben, aber ssh mycomputernur Blöcke ausgeführt, die nichts bewirken .

Ich habe die Kennwortauthentifizierung zugunsten von Schlüsseln deaktiviert, sodass eine versehentliche Verbindung mit einem Computer im lokalen Netzwerk, wenn ich nicht in meinem Heimnetzwerk bin, nicht riskieren sollte, dass mein Kennwort irgendwohin geht, wo es nicht sein sollte.

Ist es möglich, Fallback-Hostnamen anzugeben, um zu versuchen, ob der erste nicht funktioniert?

Corey Ogburn
quelle
unix.stackexchange.com/questions/424755/… ist ähnlich und kann wahrscheinlich für Hostnamen anstelle von Port angepasst werden
Thrig
Übrigens .ssh/configkann das Skripte für bestimmte Eigenschaften ausführen. Ich weiß, dass Sie mit ProxyCommand können. Sie können etwas tun, wie in diesen Fragen und Antworten von SF - serverfault.com/questions/401233/… gezeigt .
slm

Antworten:

8

Es ist hässlich, aber ich denke, Sie könnten es tun, indem Sie das execKriterium verwenden, Matchum den Ausgangsstatus eines Portklopfens zu ermitteln, z

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

Beachten Sie, dass dies nicht wirklich erkennen kann, ob Sie sich in "Ihrem" Heimnetzwerk befinden - nur, dass Sie sich in einem privaten LAN-Segment mit demselben Adressbereich befinden, in dem ein Dienst zufällig dieselbe Adresse / denselben Port überwacht.

Steeldriver
quelle
1
Ich musste ein hinzufügen -w 1oder ncschien ewig zu warten. Was einfacher sein könnte, ist das zweite Match, Match exec "true"denn wenn das erste Match fehlgeschlagen ist, versuchen Sie einfach blind die zweite Wahl.
Corey Ogburn
@CoreyOgburn ah ja ich habe versucht, einen schöneren Weg zu finden, um die alternative Bedingung zu tun (schade Matchhat keine Else)
steeldriver
Ich bin also auf ein Problem mit diesem Ansatz gestoßen. Ich betreibe auch eine Website, sagen xyz.com, und als ich versuchte , ssh xyz.commeine Match exec "true"gefangen , dass und umgeleitet mich in meinem Home - Server meine Remote - Host - Name verwendet wird . Ich werde es mit Ihrem Manager versuchen, aber ich denke, dass das Gleiche passieren wird.
Corey Ogburn
Ja, Match exec... Match !execwenn Sie Ihre verwenden, wird ssh'ing an andere Domänen gesendet, Match !execum den Hostnamen auszulösen und neu zu schreiben.
Corey Ogburn
2
Es stellt sich also heraus, dass ~/.ssh/configEinrückungen nicht weniger wichtig sind. Bestimmte Befehle setzen den Bereich zurück, dh in jeder neuen Host-Zeile heißt es: "Vorherige Zeilen waren für den vorherigen Host, die folgenden Zeilen gelten für diesen neuen Host." Es stellt sich heraus, dass MatchHost die gleiche Leistung zum Zurücksetzen des Bereichs hat wie Host. Um dies zu berücksichtigen, habe ich meine Host-Leitung durch Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"alle benutzerdefinierten Werte für mein lokales Netzwerk ersetzt und diese definiert. Ich habe dann eine passende Zeile !exechinzugefügt und alle Werte hinzugefügt, wenn ich nicht im Netzwerk bin. Jetzt funktioniert es gut für alle Hosts.
Corey Ogburn
2

Ich benutze so.

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 hat so etwas wie einen Einrückungsblock nicht. Wenn Sie den Übereinstimmungssatz auf einen bestimmten Host beschränken möchten, sollten Sie die vollständige Bedingung beschreiben.

Sie können langes Warten vermeiden, ncindem Sie -G 1die Option (Verbindungszeitlimit 1s) angeben, und Sie können das folgende Verhalten verwenden, um das mehrfache Aufrufen von zu vermeidennc

Match
Führt einen bedingten Block ein. Wenn alle Kriterien in der Übereinstimmungszeile erfüllt sind, überschreiben die Schlüsselwörter in den folgenden Zeilen die im globalen Abschnitt der Konfigurationsdatei festgelegten, bis entweder eine andere Übereinstimmungszeile oder das Ende der Datei. Wenn ein Schlüsselwort in mehreren Übereinstimmungsblöcken angezeigt wird, die erfüllt sind, wird nur die erste Instanz des Schlüsselworts angewendet.

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

SeongChan Lee
quelle
1

Nein; Wenn Sie mehrere HostNames für einen HostEintrag angeben , wird nur der erste bestätigt:

$ 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
DopeGhoti
quelle
Ich denke es macht Sinn. Wenn ich tippe ssh mycomputer, sollte es ziemlich eindeutig sein, mit welchem ​​Computer ich mich verbinde.
Corey Ogburn