Nessuna delle risposte fa esattamente ciò che ci si aspetta. Il comportamento desiderato:esegui ssh-keygen con le impostazioni predefinite (come se avessimo appena spammato Invio) senza mai chiedere input.
Il comando da eseguire è:
yes '' | ssh-keygen -N '' > /dev/null
tralascia>/dev/null se vuoi stampare l'output.
Spiegazione:
yes y
spam 'y', che ssh-keygen prende alla lettera e crea le chiavi in $PWD/y e $PWD/y.pub . yes ''
invia spam righe vuote (Invio) che è ciò che vogliamo. Specificare il file con -f ~/.ssh/id_rsa fallisce se la directory .ssh non esiste. L'opzione -t rsa non è richiesta se rsa è il tipo predefinito (stiamo comunque inviando spam). La passphrase non viene letta da stdin (su cui stiamo inserendo lo spamming) ma direttamente dalla tastiera in modo che nulla possa intercettarla. Per questo motivo è necessario specificare -N '' per passphrase vuota.
Per me, ho dovuto usare la combinazione della risposta di @Lukasz e quella di @Juan, quando si utilizzava il comando ssh
ssh -p$SSH_PORT -q [email protected]$INSTANCE_IP 'yes y | ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa'
Se non si desidera richiedere all'utente un file in cui salvare la chiave, è possibile aggiungere il flag di output del file -f
al comando.
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
In questo modo all'utente non verrà richiesto alcun input, a meno che id_rsa i file esistono già.
Dobbiamo compiere due passaggi automaticamente:
-
Inserisci una passphrase . Usa il
-N
flag (stringa vuota per questo esempio):ssh-keygen -t rsa -N ''
-
Sovrascrivi il file chiave :
Usa -f
per inserire il percorso (in questo esempio id_rsa
) più una qui-stringa per rispondere sì alla seguente domanda:
ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y >/dev/null 2>&1
Oppure, sotto un bash
come shell, se certamente vuoi sovrascrivere il precedente , usa solo una qui-stringa per alimentare il comando con tutti gli input necessari :
ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1
Da ssh-keygen
uomo pagina:
-N new_passphrase provides the new passphrase. -q silence ssh-keygen. -f filename specifies the filename of the key file.
Spiegazione passo passo
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/klashxx/.ssh/id_rsa):
1 ) Per evitare di inserire la chiave utilizzare -f
:
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa
Generating public/private rsa key pair.
/home/klashxx/.ssh/id_rsa already exists.
Overwrite (y/n)?
ATTENZIONE :Se non ti interessa il nome del file RSA e sicuramente vuoi sovrascrivere quello precedente, controlla le istruzioni sotto il punto quattro.
2 ) Ora dobbiamo rispondere "y " automaticamente alla domanda di sovrascrittura (usiamo una qui-stringa per quel lavoro):
$ ssh-keygen -t rsa -f ~/.ssh/id_rsa <<< y
Generating public/private rsa key pair.
/home/klashxx/.ssh/id_rsa already exists.
Overwrite (y/n)? Enter passphrase (empty for no passphrase):
3 ) Infine useremo il -N
flag per inserire un passaggio nullo:
$ ssh-keygen -t rsa -N '' -f ~/.ssh/id_rsa <<< y
Generating public/private rsa key pair.
/home/klashxx/.ssh/id_rsa already exists.
Overwrite (y/n)? Your identification has been saved in /home/klashxx/.ssh/id_rsa.
Your public key has been saved in /home/klashxx/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Xo0t6caMB/8TSsigxfY28JIfqYjyqxRZrFrPncx5yiU [email protected]
The key's randomart image is:
+---[RSA 2048]----+
| |
| . |
| o . |
| + * = |
| +. + BSo= o |
|...o.+o+XO... |
|.. .o.E==+B. . |
|o . ...=.o... |
|.+o. o .. |
+----[SHA256]-----+
4 ) Palla extra , pulisci l'output, basta controllare il codice di ritorno:
$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y >/dev/null 2>&1
$ echo $?
0
Un percorso alternativo per sovrascrivere il file RSA precedente (non è necessario il flag -f)
NOTA :Solo bash
come conchiglie.
Se non ti interessa il nome RSA e vuoi solo sovrascriverlo, dobbiamo rispondere automaticamente a queste due domande:
Inserisci il file in cui salvare la chiave:/example/path/.ssh/id_rsa esiste già.
Sovrascrivere (y/n)?
Se lo facciamo a mano, per la prima domanda dobbiamo solo premere invio , e per il secondo digita y
e premi enter
.
Possiamo simulare queste azioni utilizzando la seguente qui-stringa :
$'\ny'
Dal bash
pagina man:
Le parole della forma $'stringa' sono trattate in modo speciale. La parola si espande in "stringa", con i caratteri con escape backslash sostituiti come specificato dallo standard ANSI C.
\n nuova riga
Quindi, se usiamo od
per analizzare la nostra stringa:
cat - <<< $'\ny' | od -c
0000000 \n y \n
Vediamo che stiamo ottenendo proprio ciò di cui abbiamo bisogno per rispondere alle domande.
I punti 1 e 2 possono essere riassunti in :
ssh-keygen -q -t rsa <<< $'\ny'
E il comando finale sarà:
$ ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1
$ echo $?
0
Complimenti
@lukasz-dynowski, @redochka, @mellow-yellow, @yeti e il resto delle persone in questo thread.