Como faço para o git usar o ssh-add (quando necessário)?

0

No Linux (CentOS, caso isso seja importante), estou tendo um problema com os comandos do git. O git pode tirar proveito das chaves carregadas no cache do ssh-agent, mas se as chaves não forem carregadas, parece que não há nenhum passo para carregá-las (como chamar o ssh-add).

Eu tenho ~ / .ssh / config configurado da seguinte forma:

$ cat ~/.ssh/config 
Host github.com
    User git
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/github_id_rsa

Meu sistema já possui o ssh-agent configurado. Acredito que esteja usando uma implementação fornecida pelo Gnome ( link ).

Eu posso adicionar manualmente a minha chave do github com o comando "ssh-add". Quando faço isso, posso ver que a chave é carregada usando "git add -l" e os comandos do git que se conectam remotamente (por exemplo, "git remote update") funcionam sem solicitar uma frase secreta.

O que eu ainda quero que os comandos do git sejam:

  • Por padrão, se o ssh-agent estiver em execução e a chave necessária ainda não estiver carregada, use ssh-add para carregar a chave no ssh-agent.

  • ssh-add parece precisar de ajuda (através de um parâmetro) se o arquivo-chave não for um dos nomes de arquivos padrão (por exemplo, 'id_rsa', 'id_dsa' ou 'identity'). Isso parece atrasado. Eu tenho um mapeamento do hostname para IdentityFile especificado em ~ / .ssh / config como mostrado acima. O ssh-add não deveria ser capaz de usar isso?

Também ...

  • Para simplificar o problema, tentei remover o mapeamento 'IdentityFile' do ssh-config e renomear os arquivos de chaves para os nomes padrão (id_rsa e id_rsa.pub). Isso permite que "ssh-add" adicione a chave sem nenhum argumento adicional, mas mesmo nesse cenário simplificado eu não vejo os comandos git adicionando nenhuma chave ao cache do agente ssh.

Eu tenho o mesmo ~ / .ssh / config na minha máquina MacOS (Snow Leopard), e parece estar fazendo exatamente a coisa certa. Mas como posso obter esse comportamento no Linux? Não tenho certeza se isso é devido a uma diferença na implementação ou configuração de ssh-agent, ssh-add, git ou alguma combinação.

Edit: Depois de pensar sobre isso um pouco mais, eu estou pensando que isso deve ter muito mais a ver com as ferramentas ssh (talvez o mais importante, ssh-agent?) ao invés de git. Afinal de contas, este comportamento deve ser o mesmo para qualquer processo que tente fazer conexões ssh usando as chaves e configurações em ~ / .ssh, incluindo o próprio comando ssh.

    
por Charlie 21.08.2011 / 00:01

3 respostas

0

Resposta curta: O OpenSSH não suporta isso, mas versões modificadas, ou implementações alternativas de ferramentas relacionadas ao ssh, podem fazer isso.

Resposta mais longa:

O OpenSSH não faz isso pelas razões dadas na resposta de Chris Johnsen nesta página. No entanto, é possível obter esse comportamento no Linux usando o Gnome Keyring, que fornece seu próprio ssh-agent.

Na pergunta que eu postei, eu disse que achava que estava usando o Gnome Keyring (já que eu estava usando o Gnome), mas não estava. Eu tinha acabado de instalar o CentOS 5 e, nessa configuração, tenho certeza de que o daemon do agente ssh em execução era o do OpenSSH.

Eu tentei isso novamente com o Ubuntu 11.04, que definitivamente está usando o ssh-agent do Gnome Keyring. Nessa configuração, obtenho o comportamento procurado na questão.

    
por 08.09.2011 / 19:03
4

O OpenSSH padrão não faz o que você deseja. O programa ssh usará qualquer chave que já esteja carregada no agente configurado, mas nunca adicionará chaves ao agente.

O comportamento “adicionar ao agente qualquer chave protegida por senha usada pelo ssh ” é devido às mudanças da Apple na versão do ssh que é empacotado com o Mac OS X. / p>

Uma execução típica de ssh usará load_identity_file de sshconnect2.c .

A Apple adiciona à load_identity_file uma chamada para keychain_read_passphrase de keychain.c (esse arquivo vem completamente da Apple).

keychain_read_passphrase usa ssh_add_identity_constrained de authfd.c para armazenar a chave carregada no agente.

O único outro usuário de ssh_add_identity_constrained é ssh-add.c ( ssh-add ); o nível mais baixo "constantes" SSH2_AGENTC_ADD_IDENTITY e SSH2_AGENTC_ADD_ID_CONSTRAINED também são usados apenas em authfd.c em ssh-agent.c ( ssh-agent ).

Assim, normalmente apenas ssh-add carrega as chaves no agente, mas a Apple estendeu ssh para carregar as chaves no agente quando ele faz a GUI solicitando uma chave frase secreta.

    
por 21.08.2011 / 07:27
1

OpenSSH v7.2 adicionou suporte para AddKeysToAgent .

  • ssh(1): Add an AddKeysToAgent client option which can be set to
    'yes', 'no', 'ask', or 'confirm', and defaults to 'no'. When
    enabled, a private key that is used during authentication will be
    added to ssh-agent if it is running (with confirmation enabled if
    set to 'confirm').

A Apple adotou essa maneira padrão do OpenSSH no macOS 10.12.2 .

OpenSSH will no longer load keys into ssh-agent automatically. This aligns the macOS behavior with that of the upstream OpenSSH project.

It is possible for the user to re-enable loading keys into the agent by setting this option in the ssh configuration file:

AddKeysToAgent yes

    
por 18.08.2017 / 00:27