web-dev-qa-db-fra.com

Comment faire pour que ssh-agent ajoute automatiquement la clé à la demande?

Je souhaite exécuter ssh-agent (avec l'option de durée de vie maximale), mais ne pas ajouter de clé au démarrage, mais les ajouter à la demande.

Comme la première fois que je me connecte à un serveur, il devrait demander la phrase secrète, la prochaine fois (à moins d’attendre plus d’une heure), il doit se connecter proprement:

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':

Je ne veux pas me souvenir manuellement de l'exécution de 'ssh-add' à chaque fois. (Par exemple, mot de passe entré pour juste pour ssh et "Oh, il ne s’est pas souvenu, il faut ressaisir").

Comment configurer ssh pour ajouter automatiquement la clé à ssh-agent si l'utilisateur a fourni la phrase secrète?

48
Vi.

ssh prend en charge l'ajout d'une clé à l'agent lors de la première utilisation (depuis la version 7.2). Vous pouvez activer cette fonctionnalité en mettant les éléments suivants dans ~/.ssh/config:

AddKeysToAgent yes

Cela fonctionne également lorsque vous utilisez des outils dérivés, tels que git.

À partir du 7.2 journal des modifications :

  • ssh (1): ajoutez une option client AddKeysToAgent qui peut être définie sur "oui", "non", "demander" ou "confirmer" et dont la valeur par défaut est "non". Lorsqu'elle est activée, une clé privée utilisée lors de l'authentification sera ajoutée à ssh-agent s'il est en cours d'exécution (avec la confirmation activée si défini sur 'confirmer').
54
spheenik

Vous pouvez tricher et mettre quelque chose comme alias ssh='ssh-add -l || ssh-add && ssh' sur votre .bashrc/.profile. Cette première exécute ssh-add -l, qui peut renvoyer 0 (il y a des clés sur l'agent), 1 (pas de clé) ou 2 (aucun agent en cours d'exécution); s'il renvoie 0, ssh sera exécuté; si 1, ssh-add sera exécuté puis ssh; si 2, ssh-add échouera et ssh ne sera pas exécuté. Remplacez && par ; si vous souhaitez que ssh s'exécute même en l'absence d'agent.

18
Kovensky

Jusqu'à ce que ssh prenne en charge auto-call-ssh-add, j'ai ajouté ceci dans mon .bashrc, basé sur la proposition de Kovensky:

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

L'alias est créé uniquement si l'identité n'est pas ajoutée et l'alias se détruit une fois exécuté.

De cette façon, la commande ssh habituelle est utilisée après l’ajout de l’identité.

5
Marc MAURICE

J'utilise la fonction shell suivante:

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 $?
}

Il résout d'abord la configuration de l'hôte auquel je tente de me connecter, puis ajoute des clés possibles pour cet hôte à ssh-agent si elles ne sont pas encore ajoutées et se connecte enfin à l'hôte. Je suis sûr que cela peut être amélioré, alors je suis ouvert aux commentaires.

0
mbrgm