Como fazer com que o ssh-agent adicione automaticamente a chave sob demanda?

41

Eu quero rodar o ssh-agent (com a opção máxima de tempo de vida), mas não adicionar nenhuma chave na inicialização, mas sim adicioná-las sob demanda.

Assim como na primeira vez que eu faço login em algum servidor, ele deve perguntar por senha, na próxima vez (a menos que eu espere por mais de uma hora), ele deve se conectar corretamente:

ssh server1
Enter passphrase for key '/home/vi/.ssh/id_dsa':
server1> ...

ssh server2
server2> # no passphrase this time

# wait for lifetime

ssh server2
Enter passphrase for key '/home/vi/.ssh/id_dsa':

Eu não quero lembrar manualmente sobre a execução de 'ssh-add' a cada vez. (por exemplo, a senha digitada apenas para ssh e "Oh, não foi lembrado, é necessário redigitar").

Como configurar o ssh para adicionar automaticamente a chave ao ssh-agent se o usuário fornecer a frase secreta?

    
por Vi. 20.08.2011 / 19:27

4 respostas

42

ssh suporta a adição de uma chave ao agente na primeira utilização (desde a versão 7.2). Você pode ativar esse recurso colocando o seguinte em ~/.ssh/config

AddKeysToAgent yes

Isso também funciona ao usar ferramentas derivadas, como o git.

A partir do changelog 7.2:

* 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').
    
por 16.08.2016 / 19:59
18

Você pode trapacear e colocar algo como alias ssh='ssh-add -l || ssh-add && ssh' no seu .bashrc / .profile . Isso primeiro executa ssh-add -l , que pode retornar 0 (há chaves no agente), 1 (sem chaves) ou 2 (nenhum agente em execução); se retornar 0, ssh será executado; se 1, ssh-add será executado e, em seguida, ssh ; se 2, ssh-add falhará e ssh não será executado. Substitua o && por ; se desejar que ssh seja executado mesmo quando não houver agente em execução.

    
por 09.09.2011 / 15:10
5

Até que o auto-call-ssh-add seja suportado pelo ssh, adicionei isso no meu .bashrc , com base na proposta do Kovensky:

ssh-add -l >/dev/null || alias ssh='ssh-add -l >/dev/null || ssh-add && unalias ssh; ssh'

O alias é criado apenas se a identidade não for adicionada, e o alias se destrói quando executado.

Desta forma, o comando ssh regular é usado depois que a identidade foi adicionada.

    
por 08.09.2012 / 12:06
0

Estou usando a seguinte função de shell:

ssh() {
    local possible_keys=($(/usr/bin/env ssh -G $@ | grep '^identityfile' \
                           | cut -d " " -f 2- | sed -e "s|^~|$HOME|"))
    for k in $possible_keys; do
        if [[ -f $k ]]; then
            local fingerprint=$(ssh-keygen -lf $k)
            ssh-add -l | grep -q "$fingerprint" || ssh-add $k
        fi
    done
    /usr/bin/env ssh $@
    return $?
}

Primeiro, ele resolve a configuração do host ao qual estou tentando me conectar, depois adiciona chaves possíveis para esse host ao ssh-agent, se elas ainda não tiverem sido adicionadas e, finalmente, se conectarem ao host. Tenho certeza de que pode ser melhorado, por isso estou aberto a comentários.

    
por 18.06.2016 / 13:19

Tags