
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.
- 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, ssh
será executado; se 1, ssh-add
será executado e então ssh
; se for 2, ssh-add
falhará e ssh
não será executado. Substitua o &&
por ;
se desejar ssh
executar 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.