Um host .ssh / config pode ter várias entradas HostName?

10

Configurei o ssh e o encaminhamento de porta do roteador para que eu possa ssh em um computador na minha rede doméstica quando não estiver em casa. Atualmente, tenho duas entradas no meu .ssh/configarquivo, uma para quando estou na minha rede doméstica e uma para quando não estou:

Host mycomputer
  HostName 192.168.X.X

Host mycomputerathome
  HostName my.no-ip.dynamic

Isso funciona, mas estou me perguntando se posso facilitar as coisas para mim. Eu esperava que houvesse uma maneira de listar várias entradas de HostName, de modo que, se a primeira falhar, ela retornasse à segunda:

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

Para que ele primeiro tente se conectar a um host na minha rede local e, se isso não estiver presente, ele tentará se conectar usando meu nome de host dinâmico sem IP. Eu tentei digitar dois HostNames, mas executando ssh mycomputerapenas blocos sem fazer nada.

Desativei a autenticação de senha em favor das chaves, para que acidentalmente me conectasse a um computador na rede local quando não estou na minha rede doméstica, não correria o risco de minha senha ir para qualquer lugar que não deveria.

É possível especificar HostNames de fallback para tentar se o primeiro não funciona?

Corey Ogburn
fonte
unix.stackexchange.com/questions/424755/… é semelhante e provavelmente pode ser adaptado ao nome do host em vez da porta
thrig
BTW, o .ssh/configpode executar scripts para determinadas propriedades. Eu sei que você pode com ProxyCommand. Você pode fazer algo como mostrado nas perguntas e respostas em SF - serverfault.com/questions/401233/… .
Slm

Respostas:

8

É feio, mas acho que você poderia fazê-lo usando o execcritério de Matchstatus de saída de uma batida de porta, por exemplo

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

Observe que isso não pode realmente dizer se você está na "sua" rede doméstica - apenas que você está em um segmento de LAN privado com o mesmo intervalo de endereços que por acaso tem um serviço escutando no mesmo endereço / porta.

chave de aço
fonte
1
Eu tive que adicionar um -w 1ou ncparecia esperar para sempre. O que poderia ser mais simples é a segunda correspondência, Match exec "true"porque se a primeira correspondência falhar, tente cegamente a segunda opção.
Corey Ogburn
@CoreyOgburn ah sim, eu estava tentando pensar em uma maneira mais agradável para fazer a condição alternativo (coitado Matchnão tem um Else)
steeldriver
Então, eu tive um problema com essa abordagem. Eu também executar um site, dizer xyz.com, e quando eu tentei ssh xyz.como meu Match exec "true"pegou isso e me redirecionado para o meu servidor de casa usando o meu nome da máquina remota. Vou tentar com o seu executivo, mas acho que a mesma coisa acontecerá.
Corey Ogburn
Sim, usar o seu Match exec... Match !execestá causando ssh'ing para outros domínios para acionar Match !exece reescrever o HostName.
Corey Ogburn
2
Acontece que ~/.ssh/configisso não se importava com o recuo. Certos comandos redefinem o escopo, ou seja, cada nova linha do Host diz "linhas anteriores eram para o Host anterior, as seguintes linhas são para este novo Host". Acontece que Matchtem o mesmo poder de "redefinição de escopo" que o Host. Para explicar isso, substituí minha linha Host por Match Host mycomputer exec "nc -w 1 -z 192.168.X.X 22"e defini todos os valores personalizados para minha rede local. Em seguida, adicionei uma linha correspondente, exceto !execos valores de quando estou fora da rede. Agora funciona bem para todos os hosts.
Corey Ogburn
2

Eu estou usando assim.

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

O ssh_config não tem algo como bloco de indentação. Se você deseja limitar a sentença de correspondência a um host específico, deve descrever a condição completa.

Você pode evitar muito tempo de espera nc, dando a opção -G 1(timeout 1s da conexão) e pode utilizar o seguinte comportamento para evitar a chamada múltipla denc

Match
Apresenta um bloco condicional. Se todos os critérios na linha de correspondência forem atendidos, as palavras-chave nas linhas a seguir substituem as definidas na seção global do arquivo de configuração, até outra linha de correspondência ou o final do arquivo. Se uma palavra-chave aparecer em vários blocos de correspondência satisfeitos, apenas a primeira instância da palavra-chave será aplicada.

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

SeongChan Lee
fonte
1

Não; se você especificar vários HostNames para uma Hostentrada, somente a primeira será confirmada:

$ 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
fonte
Eu acho que faz sentido. Se eu digitar ssh mycomputer, deve ser bastante inequívoco a qual computador estou me conectando.
Corey Ogburn