Eu tinha um arquivo ~/.ssh/config
que estava funcionando bem. estava neste formato:
Host *
IdentityFile ~/.ssh/id_null
TCPKeepAlive no
ServerAliveCountMax 5000
Host *.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host github.com
User gcb
IdentityFile ~/.ssh/id_domain
(tinha muito mais domínios, mas vamos ignorá-los por enquanto)
Ele estava funcionando perfeitamente, até mesmo o manual dizendo que os padrões de hosts mais específicos deveriam estar no topo, sempre funcionava bem assim. Eu sempre ssh'ed para esses dois domínios e as chaves de identidade corretas foram apanhados muito bem. Eu nunca tive um problema se a chave nula fosse tentada nesses dois domínios. E eu usei isso por anos. Sempre tem o usuário e a chave certos. Eu usei esse mesmo arquivo de configuração no debian, fedora e osx.
Hoje, no osx 10.10 (OpenSSH_6.2p2, OSSLShim 0.9.8r 8 de dezembro de 2011), que funcionou antes, tentei também adicionar User unkown
à regra *
na parte superior. e, de repente, agora cada ssh eu tento, ssh envia user = unkown e identityfile = id_null, que não loga em lugar algum. Isso me fez ir ler a página de manual do ssh_config e deixar tudo exatamente pelo livro ... e ainda não funcionará. Eu também tentei remover a entrada User
de *
, mas isso não corrigiu isso.
meu atual arquivo .ssh/config
é
Host exact.hostname.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host *.domain.com
User mydomainuser
IdentityFile ~/.ssh/id_domain
Host github.com
User gcb
IdentityFile ~/.ssh/id_domain
Host *
IdentityFile ~/.ssh/id_null
TCPKeepAlive no
ServerAliveCountMax 50
ele ainda tentará usar id_null como o arquivo de identidade quando eu ssh exact.hostname.domain.com
. Eu também tentei usar vários padrões e ter Host *.domain.com exact.hostname.domain.com
em vez de repetir. Nada funciona. Alguma idéia do que está errado aí?
Como posso ter um User
e IdentityFile
padrão e substituí-los por domínio?
edite 1:
Eu adicionei o Host exact.hostname.domain.com
para antes e depois do *
one. e ssh -vvv
mostra:
debug1: /Users/.../.ssh/config line 1: Applying options for exact.hostname.domain.com
debug1: /Users/.../.ssh/config line 19: Applying options for *
debug1: /Users/.../.ssh/config line 37: Applying options for exact.hostname.domain.com
mas eu ainda recebo no final no such identity: .ssh/id_null: No such file or directory
edição 2:
alguma outra estranheza que vi em ssh -vvv
ele sempre tenta usar todas as chaves que eu tenho. Então eu imaginei porque pode ter algum padrão codificado para .ssh/id_rsa*
, então eu mudei todas as minhas chaves priv para .ssh/keys/
para escondê-lo daquele padrão, e atualizei as entradas específicas de Host
... no final, está tentando chaves de todas as entradas do host! até os que não combinam!
recapitulando, eu tenho uma correspondência de host específica na parte superior e inferior do arquivo (apenas para garantir), depois os hosts que não correspondem e o *
um.
mas o ssh -vvv mostra:
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /Users/x/.ssh/keys/id_rsa_git (0x7f954b700530),
debug2: key: /Users/x/.ssh/keys/id_rsa (0x7f954b415700), explicit
debug2: key: /Users/x/.ssh/id_null (0x0), explicit
Por que motivo está adicionando .ssh/keys/id_rsa_git
se esse for o IdentityFile
mencionado apenas em Host github.com
? e por que, finalmente, está tentando enviar id_null
mesmo que ele corresponda ao explícito Host exact.hostname.domain.com
, como diz na saída de depuração debug1: /Users/.../.ssh/config line 1: Applying options for exact.hostname.domain.com
?
edição 3:
depois que eu movi todas as minhas chaves para .ssh/keys/*
e especifico apenas as chaves lá para cada host em ssh_config
, agora eu vejo em cada ssh
instanciação:
/Users/me/.ssh/id_*[^p][^u][^b]: No such file or directory
mas mesmo depois disso, ainda carrega os IdentityFiles de outros hosts em ssh_config durante a conexão. Por quê?!