Demandez à ssh-add de se taire si la clé est déjà là

16

Je veux mettre ssh-add /path/to/special_keyen haut d'un script. Cela fonctionne bien, mais il demande toujours la phrase secrète. C'est étrange et un peu ennuyeux, car il demande toujours la phrase secrète même lorsque ssh-add -lla clé a déjà été ajoutée.

Existe-t-il un moyen de le dire: "ajoutez cette clé et demandez la phrase secrète si elle n'a pas déjà été ajoutée, sinon ne faites rien"?

Darren Cook
la source
Question similaire sur superuser.com/q/325662
Darren Cook

Réponses:

20

Je ne vois aucune option à ssh-add qui aide à atteindre le résultat souhaité, mais il est assez facile de contourner cela, étant donné que vous êtes concerné par une clé en particulier.

Commencez par saisir l'empreinte de votre clé spéciale:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

Disons que cette empreinte digitale ressemble à 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

Ensuite, en haut de votre script, utilisez ssh-add -lpour vérifier si cette clé est chargée, avant de l'inviter à l'ajouter:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

Vous pouvez regrouper tout cela en une seule ligne si vous le souhaitez:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key
Lars Rohrbach
la source
La doublure fonctionne bien, merci!
Darren Cook
1
Je trouve que ce one-liner simplifié est un peu plus compréhensible et préférable car il évite ssh-keygen(après tout, je ne veux pas générer de clés), en utilisant plutôt le chemin de clé:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus
1
ssh-keygendans la réponse ne génère pas de clé - comme ssh-add -ldans votre exemple n'ajoute rien. Les indicateurs modifient le comportement des commandes afin qu'il ne corresponde pas exactement au nom. Notez que ces versions diffèrent sur le plan fonctionnel - si la vérification par chemin et la clé à ce chemin change, votre version ne la reprendrait pas. La version dans la réponse détecterait également la clé existante, peu importe d'où elle a été chargée.
Richlv
5

Il n'y a aucun moyen direct de vérifier en utilisant simplement ssh-addmais vous pouvez utiliser ssh-keygenet certains scripts pour vérifier.

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

Ce qui précède s'imprime alors yessi l'empreinte digitale représentée par le fichier /path/to/special_keyest présente dans ssh-add -lla sortie de.

Exemple

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

Où le contenu de la sortie ssh-keygen -lf /path/to/special_keyressemble à ceci:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

Et nous utilisons `awk '{print $ 2}' pour sélectionner uniquement la 2ème colonne, qui contient l'empreinte digitale, c'est-à-dire:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

Les références

slm
la source
3

Vous pouvez avoir des raisons particulières d'utiliser ssh-addexplicitement, mais si vous voulez juste "Je veux être invité à saisir ma phrase de passe la première fois que j'utilise la clé, mais pas après", openssh a une solution plus simple:

Mettez AddKeysToAgent yesvotre .ssh/configdossier.

Nate
la source
Merci. Cela a apparemment été ajouté dans ssh 7.2 (Ubuntu 18 semble être sur la version 7.6).
Darren Cook
Oui, "AddKeysToAgent n'est pas pris en charge par ma version openssh" est une bonne raison d'utiliser explicitement ssh-add ;-)
Nate
0

ssh-add -K FILEa bien fonctionné pour moi sur Mac.
Il affiche toujours les lignes "Identité ajoutée:" mais ne demande pas de phrase secrète.

Depuis la page de manuel:

-K Lors de l'ajout d'identités, chaque phrase secrète sera également stockée dans le trousseau de l'utilisateur. Lors de la suppression des identités avec -d, chaque phrase secrète en sera supprimée.

Ivan
la source