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

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

Quero executar o ssh-agent (com opção de vida útil máxima), mas não adicionar nenhuma chave na inicialização, mas adicioná-las sob demanda.

Como na primeira vez que faço login em algum servidor, ele deve solicitar a senha, da próxima vez (a menos que eu espere 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':

Não quero me lembrar manualmente de executar 'ssh-add' todas as vezes. (por exemplo, senha inserida apenas para ssh e "Ah, não lembrei, preciso digitar novamente").

Como configurar o ssh para adicionar automaticamente a chave ao ssh-agent se o usuário forneceu a senha?

Responder1

ssh suporta adicionar 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.

De7.2 registro de alterações:

  • ssh(1): Adiciona uma opção de cliente AddKeysToAgent que pode ser definida como 'sim', 'não', 'perguntar' ou 'confirmar' e o padrão é 'não'. Quando habilitado, uma chave privada usada durante a autenticação será adicionada ao ssh-agent se ele estiver em execução (com a confirmação habilitada se definida como 'confirmar').

Responder2

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

Responder3

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

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

O alias será criado somente se a identidade não for adicionada e o alias se destruirá após ser executado.

Desta forma, o comando ssh regular é usado após a adição da identidade.

Responder4

Estou usando a seguinte função 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 $?
}

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

informação relacionada