Fai ssh-add in silenzio se la chiave è già lì


16

Voglio mettere ssh-add /path/to/special_keyin cima a una sceneggiatura. Funziona bene, ma richiede sempre la passphrase. Questo è strano e un po 'fastidioso, poiché richiede ancora la passphrase anche quando ssh-add -lmostra che la chiave è già stata aggiunta.

C'è un modo per dirlo: "aggiungi questa chiave e chiedi la passphrase se non è già stata aggiunta, altrimenti non fare nulla"?


Risposte:


20

Non vedo alcuna opzione per aggiungere ssh che aiuti a raggiungere il risultato desiderato, ma è abbastanza facile aggirare questo, dato che ti preoccupi di una chiave in particolare.

Innanzitutto, prendi l'impronta digitale per il tuo special_key:

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

Diciamo che questa impronta digitale sembra 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

Quindi, nella parte superiore dello script, utilizzare ssh-add -lper verificare se quella chiave è caricata, prima di richiedere di aggiungerla:

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

Puoi piegare tutto questo in una riga se desideri:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key

Il one-liner funziona bene, grazie!
Darren Cook,

1
Trovo che questo one-liner semplificato sia un po 'più comprensibile e preferibile poiché evita ssh-keygen(dopotutto, non voglio generare alcuna chiave), invece usando il percorso chiave:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus,

1
ssh-keygennella risposta non genera una chiave - lo stesso ssh-add -ldel tuo esempio non aggiunge nulla. I flag modificano il comportamento dei comandi in modo che non corrisponda esattamente al nome. Nota che queste versioni differiscono funzionalmente: se il controllo per percorso e la chiave in quel percorso cambiano, la tua versione non la prenderebbe. La versione nella risposta rileverà anche la chiave esistente indipendentemente da dove è stata caricata.
Richlv,

5

Non esiste un modo diretto per verificare utilizzando solo ssh-addma è possibile utilizzare ssh-keygene alcuni script per verificare.

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

Quanto sopra verrebbe quindi stampato yesse l'impronta digitale rappresentata dal file /path/to/special_keyfosse presente ssh-add -lnell'output di.

Esempio

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

Da dove il contenuto dell'output ssh-keygen -lf /path/to/special_keyè simile al seguente:

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

E stiamo usando `awk '{print $ 2}' per selezionare solo la seconda colonna, che contiene l'impronta digitale, ovvero:

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

Riferimenti


3

Potresti avere particolari motivi per usare ssh-addesplicitamente, ma se vuoi solo "Voglio essere richiesto per la mia passphrase la prima volta che utilizzo la chiave, ma non dopo", openssh ha una soluzione più semplice:

Inserisci il AddKeysToAgent yestuo .ssh/configfile.


Grazie. Ciò apparentemente è stato aggiunto in ssh 7.2 (Ubuntu 18 sembra essere nella versione 7.6).
Darren Cook,

Sì, "AddKeysToAgent non è supportato dalla mia versione di openssh" è un buon motivo per usare esplicitamente ssh-add ;-)
Nate

0

ssh-add -K FILE ha funzionato bene per me su Mac.
Mostra ancora le righe "Identità aggiunta:" ma non richiede la passphrase.

Dalla pagina man:

-K Quando si aggiungono identità, ogni passphrase verrà anche memorizzata nel portachiavi dell'utente. Quando si rimuovono le identità con -d, ciascuna passphrase verrà rimossa da essa.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.