70 votes

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

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

Par exemple, la première fois que je me connecte à un serveur, il devrait demander une phrase de passe, et la fois suivante (à moins que j'aie attendu plus d'une heure), il devrait 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 avoir à me rappeler manuellement de lancer 'ssh-add' à chaque fois. (par exemple, j'ai entré une phrase de passe juste pour ssh et "Oh, il ne s'en est pas souvenu, je dois la retaper").

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

89voto

spheenik Points 1014

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 ce qui suit dans le champ ~/.ssh/config :

AddKeysToAgent yes

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

De la 7.2 journal des modifications :

  • ssh(1) : Ajout d'une option client AddKeysToAgent qui peut être configurée pour yes', 'no', 'ask', ou 'confirm', et dont la valeur par défaut est 'no'.  Lorsque activée, une clé privée utilisée lors de l'authentification sera ajoutée à d'authentification sera ajoutée à ssh-agent s'il est en cours d'exécution (avec une confirmation définie sur 'confirm').

18voto

Jessidhia Points 2790

Vous pourriez tricher et mettre quelque chose comme alias ssh='ssh-add -l || ssh-add && ssh' sur votre .bashrc / .profile . Ce premier parcours ssh-add -l qui peut renvoyer 0 (il y a des clés sur l'agent), 1 (pas de clés) ou 2 (aucun agent en cours d'exécution) ; s'il renvoie 0, ssh s'exécutera ; si 1, ssh-add s'exécutera et ensuite ssh ; si 2, ssh-add échouera et ssh ne sera pas exécuté. Remplacez le && con ; si vous voulez ssh pour fonctionner même quand il n'y a pas d'agent en cours d'exécution.

5voto

user151699 Points 1

Jusqu'à ce que l'auto-call-ssh-add soit supporté par ssh, j'ai ajouté ceci dans mes .bashrc sur la base de 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 lui-même une fois exécuté.

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

2voto

mbrgm Points 21

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 j'essaie de me connecter, puis ajoute les clés possibles pour cet hôte à l'agent ssh si elles ne sont pas encore ajoutées et enfin se connecte à l'hôte. Je suis sûr qu'il peut être amélioré, donc je suis ouvert aux commentaires.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X