Múltiplo 'Host *' no ssh_config?

27

Meu entendimento da maneira como o ~ / .ssh / config funciona é que cada linha 'Host' entra em vigor para qualquer host correspondente após esse ponto no arquivo de configuração.

Eu tenho vários servidores pessoais e servidores de trabalho aos quais preciso me conectar. Estou tentando fazer algo como o seguinte:

# Configurações Gerais
ControlMaster auto
ControlPath ~/.ssh/controlmaster/%r@%h:% p
ForwardAgent sim
ForwardX11 sim
GSSAPIAuthentication no
PubkeyAuthentication yes

# Servidores pessoais
Hospedeiro *
Usuário harleypig
Arquivo de identidade ~ / .ssh / personal_id_rsa

Anfitrião host1
Nome do host host1.com

Host host2
Nome do host host2.com

# Servidores de trabalho
Hospedeiro *
Usuário alan.young
Arquivo de identidade ~ / .ssh / work_id_rsa

Trabalho do host1
Nome do host work1.companyserver.com

Trabalho do host2
Nome do host work2.companyserver.com

Hospedeiro *
Usuário devuser

Host dev1
Nome do host dev1.companyserver.com

Host dev2
Nome do host dev2.companyserver.com

Os documentos parecem indicar que host1 e host2 devem usar 'personal_id_rsa' e o usuário harleypig. work1, work2, dev1 e dev2 devem usar 'work_id_rsa' e os dois primeiros devem ser o usuário 'alan.young' e dev1 e dev2 devem ser o usuário 'devuser'

No entanto, isso não está acontecendo. Qualquer que seja o 'Host *' que eu coloquei primeiro, é com o que todos os hosts a seguir tentam se conectar. Estou entendendo mal ou faltando alguma coisa?

harleypig
fonte
Obrigado, entre as duas respostas, consegui fazer minhas conexões funcionarem.
22411 harleypig

Respostas:

36

Do ssh_configmanual :

Como o primeiro valor obtido para cada parâmetro é usado, mais declarações específicas do host devem ser fornecidas perto do início do arquivo e os padrões gerais no final.

Portanto, no seu exemplo, todos os hosts usarão User harleypige IdentityFile ~/.ssh/personal_id_rsa.

Pense nas Hostdiretivas com caracteres curinga como fallbacks: use as seguintes configurações apenas se ainda não tiverem sido definidas. Você precisa escrever algo como isto:

Host host1
Hostname host1.com
Host host2
Hostname host2.com
Host host*
User harleypig
IdentityFile ~/.ssh/personal_id_rsa

Você pode colocar vários padrões em uma Hostlinha se um determinado conjunto de aliases de host não puder corresponder a caracteres curinga, por exemplo Host host* more* outlier.

Gilles 'SO- parar de ser mau'
fonte
15

Você definitivamente está fazendo errado.

  • Você deve sempre colocar Host *como a última entrada.
  • Você não pode ter várias Host *entradas

Se suas máquinas de trabalho tiverem um formato de nome que você possa generalizar para segmentar apenas as máquinas de trabalho, por exemplo: machine1.work.com, host.work.com, fileserver.work.com, será possível segmentar suas máquinas de trabalho como:

Host *.work.com
User alan.young
IdentityFile ~/.ssh/work_id_rsa

O mesmo se aplica às suas máquinas pessoais.

Hameedullah Khan
fonte
Para mim, colocar Host *no início do arquivo parece funcionar bem. Talvez o fato de você estar usando um curinga supere o fato de ser a primeira entrada ao priorizá-los?
Zaz 11/02
Btw, o Host *.work.comé uma sintaxe inválida. Funciona apenas o contrário:Host myserver*
Daniel Andrei Mincă 20/02
3
@ MincăDanielAndrei funciona nos dois sentidos, é apenas uma expressão curinga e você pode usá-lo como qualquer outro curinga. Host git-codecommit. *. Amazonaws.com Este é um exemplo de trabalho do meu ~ / .ssh / config #
Hameedullah Khan
@HameedullahKhan, sério, eu tentei isso e não está respondendo. Se você o fizer Host *subdomain.com, não responderá.
Daniel Andrei Mincă 22/02
11
@ MincăDanielAndrei Esse comportamento está documentado nas páginas de manual, se não funcionar (para mim também), é um bug.
Goetzc