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

51

Je souhaite exécuter ssh-agent (avec l'option de durée de vie maximale), mais sans 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 (sauf si j'ai attendu 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?

Vi.
la source

Réponses:

58

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 journal des modifications 7.2 :

  • ssh (1): Ajoutez une option client AddKeysToAgent qui peut être définie sur "oui", "non", "demander" ou "confirmer", et par défaut sur "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').
Spheenik
la source
Cela nécessite l'exécution d'un agent ssh. Reportez-vous à stackoverflow.com/a/24347344/4573065 + ses commentaires pour une bonne méthode de démarrage (une seule fois).
ST-DDT
18

Vous pouvez tricher et mettre quelque chose comme alias ssh='ssh-add -l || ssh-add && ssh'sur votre .bashrc/ .profile. Cette première exécution ssh-add -lpeut 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 retourne 0, sshs'exécutera; si 1, ssh-addcourra et alors ssh; si 2, ssh-addéchouera et sshne sera pas exécuté. Remplacez le &&avec par ;si vous voulez sshexécuter même si aucun agent n'est en cours d'exécution.

Jessidhia
la source
3
Il demandera la phrase secrète à la clé même si une autre commande ssh ne l'utilise pas.
Vi.
@Vi. true, mais rares sont les commandes qui ne les utilisent pas (à moins que vous ne vous connectiez à un serveur utilisant un clavier interactif). La clé sera dans l'agent chaque fois que vous en aurez besoin par la suite. De plus, le pseudonyme heureusement (ou malheureusement) ne modifie pas les utilisations principales de ssh (comme avec git ou rsync).
Jessidhia
2
(penser à écrire le correctif auto-call-ssh-add pour le client ssh)
Vi.
Sur la base de cette réponse , vous pouvez créer un alias pour un des hôtes spécifiques: alias ssh-hostname='(ssh-add -l | grep hostname > /dev/null) || ssh-add ~/.ssh/id_rsa_hostname && ssh -p 12345 username@hostname'. Vous pouvez même mettre cela en boucle pour toutes vos clés ssh et générer des alias. Un bidouillage sale, mais ça marche.
dset0x
5

Jusqu'à ce que ssh .bashrcprenne en charge auto-call-ssh-add, j'ai ajouté ceci dans ma proposition, basée 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 que l'identité a été ajoutée.

Marc Maurice
la source
Ne fonctionnera pas dans mon cas à cause de ssh-add aussi avoir un timeout configuré, mais l'idée est assez bonne.
Vi.
@Vi. Comment un délai d'attente affecterait-il cela? Cela semble bien fonctionner pour moi.
Lanan
1
@lanrat, Ceci vérifie si la clé est présente dans ssh-agent et configure un alias en fonction de la présence. Mais en raison de l'expiration du délai ( ssh-add -t ...), la clé ajoutée à ssh-agent peut disparaître brusquement, mais le pseudonyme restera car il est toujours en mémoire.
Vi.
1

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 les clés possibles de 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.

mbrgm
la source