Un hôte .ssh / config peut-il avoir plusieurs entrées HostName?

10

J'ai configuré le transfert de port ssh et routeur afin que je puisse ssh dans un ordinateur sur mon réseau domestique lorsque je ne suis pas à la maison. Actuellement, j'ai deux entrées dans mon .ssh/configfichier, une pour quand je suis sur mon réseau domestique et une pour quand je ne suis pas:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

Cela fonctionne mais je me demande si je peux me faciliter les choses. J'espérais qu'il existe un moyen de répertorier plusieurs entrées HostName de telle sorte que si la première échoue, elle revient à la seconde:

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

Pour qu'il essaie d'abord de se connecter à un hôte sur mon réseau local et s'il n'est pas présent, il essaiera de se connecter en utilisant mon nom d'hôte dynamique sans IP. J'ai essayé d'entrer deux HostNames mais en exécutant ssh mycomputerjuste des blocs sans rien faire.

J'ai désactivé l'authentification par mot de passe en faveur des clés, donc la connexion accidentelle à un ordinateur sur le réseau local lorsque je ne suis pas sur mon réseau domestique ne devrait pas risquer que mon mot de passe aille partout où il ne devrait pas.

Est-il possible de spécifier des HostNames de secours pour essayer si le premier ne fonctionne pas?

Corey Ogburn
la source
unix.stackexchange.com/questions/424755/… est similaire et peut probablement être adapté pour le nom d'hôte au lieu du port
thrig
BTW, le .ssh/configpeut exécuter des scripts pour certaines propriétés. Je sais que vous pouvez le faire avec ProxyCommand. Vous pouvez faire quelque chose comme indiqué dans ce Q&R de SF - serverfault.com/questions/401233/… .
slm

Réponses:

8

C'est moche, mais je pense que vous pouvez le faire en utilisant le execcritère de Matchl'état de sortie d'un port, par exemple

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

Notez que cela ne peut pas vraiment dire si vous êtes sur "votre" réseau domestique - juste que vous êtes sur un segment LAN privé avec la même plage d'adresses qui se trouve avoir un service d'écoute sur la même adresse / port.

tournevis
la source
1
J'ai dû en ajouter un, -w 1sinon il a ncsemblé attendre toujours. Ce qui pourrait être plus simple, c'est le deuxième match, Match exec "true"car si le premier match a échoué, essayez simplement le deuxième choix à l'aveuglette.
Corey Ogburn
@CoreyOgburn ah oui j'essayais de penser à une meilleure façon de faire la condition alternative (dommage Matchn'a pas de Else)
steeldriver
J'ai donc rencontré un problème avec cette approche. Je gère également un site, disons xyz.com, et quand j'ai essayé de ssh xyz.comle Match exec "true"capturer et de me rediriger vers mon serveur domestique en utilisant mon nom d'hôte distant. J'essaierai avec votre directeur mais je pense que la même chose se produira.
Corey Ogburn
Oui, l'utilisation de votre Match exec... Match !execfait que ssh'ing vers d'autres domaines déclenche le Match !execet réécrit le HostName.
Corey Ogburn
2
Il s'avère donc que l' ~/.ssh/configon ne peut pas se soucier de l'indentation. Certaines commandes réinitialisent la portée, c'est-à-dire que chaque nouvelle ligne d'hôte dit "les lignes précédentes étaient pour l'hôte précédent, les lignes suivantes sont pour ce nouvel hôte". Il s'avère qu'il Matcha le même pouvoir de «réinitialisation de la portée» que l'hôte. Pour tenir compte de cela, j'ai remplacé ma ligne hôte par Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"et défini toutes les valeurs personnalisées pour mon réseau local. J'ai ensuite ajouté une ligne correspondante sauf !execet ajouté toutes les valeurs pour quand je suis hors réseau. Maintenant, cela fonctionne bien pour tous les hôtes.
Corey Ogburn
2

J'utilise comme ça.

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 n'a pas quelque chose comme un bloc d'indentation. Si vous souhaitez limiter la phrase de correspondance à un hôte spécifique, vous devez décrire la condition complète.

Vous pouvez éviter l'attente longue ncen lui donnant l' -G 1option (timeout de connexion 1s), et vous pouvez utiliser le comportement suivant pour éviter l'invocation multiple denc

Match
Introduit un bloc conditionnel. Si tous les critères de la ligne de correspondance sont satisfaits, les mots clés des lignes suivantes remplacent ceux définis dans la section globale du fichier de configuration, jusqu'à une autre ligne de correspondance ou à la fin du fichier. Si un mot clé apparaît dans plusieurs blocs de correspondance qui sont satisfaits, seule la première instance du mot clé est appliquée.

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

SeongChan Lee
la source
1

Non; si vous spécifiez plusieurs HostNames pour une Hostentrée, seule la première sera reconnue:

$ 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
la source
Je suppose que cela a du sens. Si je tape, ssh mycomputeril devrait être assez clair à quel ordinateur je me connecte.
Corey Ogburn