Niech ssh-add będzie cichy, jeśli klucz już tam jest

16

Chcę umieścić ssh-add /path/to/special_keyna górze skryptu. Działa to dobrze, ale zawsze monituje o podanie hasła. Jest to dziwne i trochę denerwujące, ponieważ wciąż prosi o hasło, nawet jeśli ssh-add -lpokazuje, że klucz został już dodany.

Czy istnieje sposób, aby to powiedzieć: „dodaj ten klucz i zapytaj hasło, jeśli jeszcze nie zostało dodane, w przeciwnym razie nic nie rób”?

Darren Cook
źródło
Podobne pytanie na superuser.com/q/325662
Darren Cook

Odpowiedzi:

20

Nie widzę żadnych opcji dodawania ssh, które pomagają osiągnąć pożądany rezultat, ale dość łatwo jest obejść ten problem, biorąc pod uwagę, że martwisz się w szczególności jednym kluczem.

Najpierw chwyć odcisk palca dla klucza specjalnego:

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

Powiedzmy, że ten odcisk palca wygląda jak 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

Następnie u góry skryptu użyj, ssh-add -laby sprawdzić, czy ten klucz jest załadowany, zanim pojawi się monit o dodanie:

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

Możesz złożyć to wszystko razem w jedną linię, jeśli chcesz:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key
Lars Rohrbach
źródło
One-liner działa dobrze, dzięki!
Darren Cook
1
Uważam, że ten uproszczony jednowierszowy jest nieco bardziej zrozumiały i preferowany, ponieważ unika ssh-keygen(w końcu nie chcę generować żadnych kluczy), zamiast tego używa ścieżki klucza:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus
1
ssh-keygenw odpowiedzi nie generuje klucza - tak jak ssh-add -lw twoim przykładzie tak naprawdę nic nie dodaje. Flagi modyfikują zachowanie poleceń, aby nie pasowały dokładnie do nazwy. Zauważ, że te wersje różnią się funkcjonalnie - jeśli sprawdzanie ścieżki i klucz przy tej ścieżce ulegnie zmianie, twoja wersja go nie odbierze. Wersja w odpowiedzi wykryłaby również istniejący klucz bez względu na to, skąd został załadowany.
Richlv
5

Nie ma bezpośredniego sposobu sprawdzenia za pomocą samego, ssh-addale możesz skorzystać z ssh-keygenniektórych skryptów do sprawdzenia.

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

Powyższe wydrukowałoby się wtedy, yesgdyby odcisk palca reprezentowany przez plik /path/to/special_keybył obecny na ssh-add -lwyjściu.

Przykład

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

Gdzie zawartość danych wyjściowych ssh-keygen -lf /path/to/special_keywygląda następująco:

$ 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)

I używamy `awk '{print $ 2}', aby wybrać tylko drugą kolumnę, która zawiera odcisk palca, tj .:

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

Bibliografia

slm
źródło
3

Możesz mieć szczególne powody, aby używać ssh-addjawnie, ale jeśli chcesz tylko „Chcę otrzymać monit o moje hasło przy pierwszym użyciu klucza, ale nie później”, openssh ma prostsze rozwiązanie:

Umieść AddKeysToAgent yesw swoim .ssh/configpliku.

Nate
źródło
Dzięki. Zostało to najwyraźniej dodane w ssh 7.2 (Ubuntu 18 wydaje się być w wersji 7.6).
Darren Cook
Tak, „AddKeysToAgent nie jest obsługiwany przez moją wersję openssh” to dobry powód do jawnego używania ssh-add ;-)
Nate
0

ssh-add -K FILEdziałało dobrze dla mnie na komputerze Mac.
Nadal pokazuje linie „Tożsamość dodana:”, ale nie prosi o hasło.

Ze strony podręcznika:

-K Podczas dodawania tożsamości każde hasło będzie również przechowywane w pęku kluczy użytkownika. Podczas usuwania tożsamości za pomocą -d każde hasło zostanie z niego usunięte.

Ivan
źródło