Correspondência de expressões regulares na configuração ssh

2

Eu tenho um monte de servidores com os nomes srv1.domain.com, srv2.domain.com, ..., srv50.domain.com

Eu quero ser capaz de se conectar a esses servidores por ssh srv1

Eu não quero colocar 50 entradas de configuração no meu .ssh / config como

HOST srv1
HOSTNAME srv1.domain.com
USER amac
IdentityFile /home/amac/.ssh/id_rsa

O que eu gosto é de uma correspondência de expressões regulares, o que me permitiria escrever algo como

HOSTNAME (srv[0-9]*).domain.com
HOST 
USER amac
IdentityFile /home/amac/.ssh/id_rsa

Isso é possível? Talvez criando um alias bash que converteria todas as instâncias de "srv (. *)" Para srv \ 1.domain.com, onde \ 1 corresponde à substring na parantesia correspondida pela expressão regular?

Obrigado.

    
por Ruggiero Spearman 23.02.2012 / 16:45

4 respostas

2

Isso soa como um problema melhor resolvido pelo DNS. Adicione isto ao seu /etc/resolv.conf :

search domain.com

Se uma pesquisa de DNS não tiver pontos 1 ou retornar uma resposta NXDOMAIN, outra pesquisa de DNS será feita com esse valor de pesquisa anexado.

Exemplos:

Se você fizer ssh srv1 , a pesquisa de DNS será feita para srv1.domain.com .

Se você usar ssh srv1.dc1 , a pesquisa de DNS será por srv1.dc1 , que retornará NXDOMAIN. A pesquisa de DNS de acompanhamento automático será para srv1.dc1.domain.com .

Você pode adicionar vários domínios de pesquisa a essa linha separados por espaço em branco e eles serão tentados na ordem listada até que um deles retorne um registro A 2 .

1.) Este valor é configurável e refere-se ao número de pontos que o nome abreviado deve ter menos que. O valor padrão é 1 e deve ser definido como maior que 1 para sites em que os hosts estejam no formato srv1.dc1.domain.com . Isso evita a solicitação inútil para os servidores raiz do domínio de nível superior dc1 .

2.) Ou um registro AAAA.

    
por 23.02.2012 / 19:21
5

Isso deve fazer o truque no OpenSSH 5.5 e superior.

Host *.*
  Hostname %h

Host *
  Hostname %h.domain.com
  IdentityFile /path/to/keyfile.pem

A primeira regra corresponde a qualquer nome de domínio normal e apenas passa o nome do domínio. A segunda regra lida com hosts de palavra única e anexa domain.com ao final.

Um efeito colateral disso é que, mesmo para chamadas ssh para anotherdomain.com, o ssh tentará usar o IdentityFile para domain.com. Eu não acho que isso importa, no entanto.

    
por 15.04.2014 / 05:38
2

Você pode usar ProxyCommand para usar regex no nome do host especificado na linha de comando.

Host srv*.domain.com
    User amac
    ProxyCommand nc $(sed -e "s/.domain.com//" <<< "%h") %p
    IdentityFile /home/amac/.ssh/id_rsa

Agora, ssh srv23.domain.com se conectaria a srv23 .

Note que você não precisa especificar HostName .

    
por 10.11.2016 / 10:37
1

openssh suporta padrões (veja link ), mas não referências a correspondências (AFAIK).

Você pode especificar curingas da mesma forma que na pergunta:

Host srv*.domain.com
  User amac
  IdentityFile /home/amac/.ssh/id_rsa

Se você não quer ter que especificar o hostname completo, você pode fazer o truque de dns mencionado antes (e mudar a linha do Host para srv *) ou criar uma função de shell da seguinte forma:

ss() {
  if [ -z "$1" ]; then
    echo "specify a server #, eg ss 10"
  else
    echo "ssh'ing to srv$1.domain.com"
    ssh srv$1.domain.com
  fi
}

e use-o como:

ss 10

Mais fácil do que alterar o DNS e não causa problemas quando você deseja acessar srv01.someotherdomain.com.

    
por 21.02.2013 / 01:19