¿Puede un host .ssh / config tener múltiples entradas HostName?

10

He configurado el reenvío de puertos ssh y de enrutador para poder ssh en una computadora en mi red doméstica cuando no estoy en casa. Actualmente tengo dos entradas en mi .ssh/configarchivo, una para cuando estoy en mi red doméstica y otra para cuando no estoy:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

Esto funciona, pero me pregunto si puedo facilitarme las cosas. Esperaba que haya una manera de enumerar múltiples entradas de HostName de modo que si el primero falla, vuelva al segundo:

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

Por lo tanto, primero intentará conectarse a un host en mi red local y, si no está presente, intentará conectarse utilizando mi nombre de host dinámico sin IP. Intenté ingresar dos HostNames, pero ejecuté ssh mycomputersolo bloques sin hacer nada.

Desactivé la autenticación de contraseña a favor de las claves, por lo que conectarme accidentalmente a una computadora en la red local cuando no estoy en mi red doméstica no debería arriesgar mi contraseña a ningún otro lugar.

¿Es posible especificar HostNames alternativo para probar si el primero no funciona?

Corey Ogburn
fuente
unix.stackexchange.com/questions/424755/... es similar y, probablemente, se pueden adaptar para el nombre de host en lugar del puerto
thrig
Por cierto, .ssh/configpuede ejecutar scripts para ciertas propiedades. Sé que puedes con ProxyCommand. Puede hacer algo como se muestra en estas preguntas y respuestas de SF - serverfault.com/questions/401233/… .
slm

Respuestas:

8

Es feo, pero creo que podría hacerlo utilizando el execcriterio para Matchel estado de salida de un puerto, p. Ej.

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

Tenga en cuenta que esto realmente no puede decir si está en "su" red doméstica, solo que está en un segmento de LAN privada con el mismo rango de direcciones que tiene un servicio que escucha en la misma dirección / puerto.

conductor de acero
fuente
1
Tuve que agregar un -w 1o ncparecía esperar para siempre. Lo que podría ser más simple es que el segundo partido puede Match exec "true"porque si el primer partido falla, simplemente prueba ciegamente la segunda opción.
Corey Ogburn
@CoreyOgburn ah sí, estaba tratando de pensar en una mejor manera de hacer la condición alternativa (lástima Matchque no tenga Else)
steeldriver
Así que me encontré con un problema con este enfoque. También ejecuta un sitio, por ejemplo xyz.com, y cuando traté de ssh xyz.commi Match exec "true"capturado ese y me redirige a mi servidor usando mi nombre del ordenador remoto. Intentaré con tu ejecutivo, pero creo que sucederá lo mismo.
Corey Ogburn
Sí, usar your Match exec... Match !execestá causando que ssh'ing a otros dominios active Match !execy reescriba el HostName.
Corey Ogburn
2
Entonces resulta que ~/.ssh/configno podría importarle menos la sangría. Ciertos comandos restablecen el alcance, es decir, cada nueva línea de Host dice "las líneas anteriores eran para el Host anterior, las siguientes líneas son para este nuevo Host". Resulta que Matchtiene la misma potencia de "restablecimiento del alcance" que el Host. Para dar cuenta de esto, reemplacé mi línea de Host con Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"y definí todos los valores personalizados para mi red local. Luego agregué una línea coincidente excepto !execy agregué todos los valores para cuando estoy fuera de la red. Ahora funciona bien para todos los hosts.
Corey Ogburn
2

Estoy usando así.

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 no tiene algo como el bloque de sangría. Si desea limitar la oración de coincidencia a un host específico, entonces debe describir la condición completa.

Puede evitar la espera prolongada ncdándole la -G 1opción (tiempo de espera de conexión 1s), y puede utilizar el siguiente comportamiento para evitar la invocación múltiple denc

Match
Introduce un bloque condicional. Si se cumplen todos los criterios en la línea de coincidencia, las palabras clave en las siguientes líneas anulan las establecidas en la sección global del archivo de configuración, hasta que aparezca otra línea de coincidencia o el final del archivo. Si una palabra clave aparece en varios bloques de coincidencia que se satisfacen, solo se aplica la primera instancia de la palabra clave.

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

SeongChan Lee
fuente
1

No; si especifica varios HostNames para una Hostentrada, solo se reconocerá la primera:

$ 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
fuente
Supongo que tiene sentido. Si escribo, ssh mycomputerno debería ser ambiguo a qué computadora me estoy conectando.
Corey Ogburn