Ninguna de las respuestas hace exactamente lo que se espera. El comportamiento deseado:ejecutar ssh-keygen con la configuración predeterminada (como si solo enviáramos Enter) sin solicitar entrada alguna.
El comando a ejecutar es:
yes '' | ssh-keygen -N '' > /dev/null
omita>/dev/null si desea imprimir la salida.
Explicación:
yes y
spams 'y', que ssh-keygen toma literalmente y crea las claves en $PWD/y y $PWD/y.pub . yes ''
spams líneas vacías (Enter) que es lo que queremos. Especificar el archivo con -f ~/.ssh/id_rsa falla si el directorio .ssh no existe. La opción -t rsa no es necesaria si rsa es el tipo predeterminado (estamos ingresando spam de todos modos). La frase de contraseña no se lee desde la entrada estándar (en la que estamos enviando spam), sino directamente desde el teclado para que nada pueda interceptarla. Por este motivo, debe especificar -N '' para la frase de contraseña vacía.
Para mí, tuve que usar una combinación de la respuesta de @Lukasz y la de @Juan, al usar el comando ssh
ssh -p$SSH_PORT -q [email protected]$INSTANCE_IP 'yes y | ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa'
Si no desea solicitar al usuario un archivo en el que guardar la clave, puede agregar el indicador de salida del archivo -f
al comando.
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
De esta forma, no se solicitará al usuario ninguna entrada, a menos que id_rsa los archivos ya existen.
Necesitamos lograr dos pasos automáticamente:
-
Ingrese una frase de contraseña . Utilice el
-N
bandera (cadena vacía para este ejemplo):ssh-keygen -t rsa -N ''
-
Sobrescribir el archivo clave :
Usa -f
para ingresar la ruta (en este ejemplo id_rsa
) más una cadena aquí para responder sí a la siguiente pregunta:
ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y >/dev/null 2>&1
O, bajo un bash
como shell, si ciertamente quieres sobrescribir el anterior , use solo una cadena aquí para alimentar el comando con toda la necesidad de entrada :
ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1
Desde ssh-keygen
hombre página:
-N new_passphrase provides the new passphrase. -q silence ssh-keygen. -f filename specifies the filename of the key file.
Explicación paso a paso
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/klashxx/.ssh/id_rsa):
-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)?
ATENCIÓN :Si no le importa el nombre del archivo RSA y ciertamente desea sobrescribir el anterior, consulte las instrucciones debajo del punto cuatro.
$ 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):
-N
bandera para ingresar un pase nulo:
$ 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]-----+
$ ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa <<<y >/dev/null 2>&1
$ echo $?
0
Una ruta alternativa para sobrescribir el archivo RSA anterior (no se necesita el indicador -f)
NOTA :Solo bash
como conchas.
Si no le importa el nombre RSA y solo desea sobrescribirlo, debemos responder estas dos preguntas automáticamente:
-
Introduzca el archivo en el que guardar la clave:/example/path/.ssh/id_rsa ya existe.
-
¿Sobrescribir (sí/no)?
Si hacemos esto a mano, para la primera pregunta solo tenemos que pulsar enter , y para el segundo, escriba y
y presiona enter
.
Podemos simular estas acciones usando la siguiente here-string :
$'\ny'
Del bash
página man:
Las palabras de la forma $'cadena' se tratan de forma especial. La palabra se expande a "cadena", con caracteres de escape de barra invertida reemplazados según lo especificado por el estándar ANSI C.
\n nueva línea
Entonces, si usamos od
para analizar nuestra cadena:
cat - <<< $'\ny' | od -c
0000000 \n y \n
Vemos que estamos obteniendo justo lo que necesitamos para responder las preguntas.
Los puntos 1 y 2 se pueden resumir en :
ssh-keygen -q -t rsa <<< $'\ny'
Y el comando final será:
$ ssh-keygen -q -t rsa -N '' <<< $'\ny' >/dev/null 2>&1
$ echo $?
0
Felicitaciones
@lukasz-dynowski, @redochka, @mellow-yellow, @yeti y el resto de la gente en este hilo.