Ssh-keygen automatizado sin frase de contraseña, ¿cómo?

86

Me gustaría hacer un script automatizado que llame ssh-keygeny cree algunos pares de claves pub / privados que usaré más adelante. En principio todo funciona bien con ...
ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
... excepto que me pide la frase de contraseña que cifraría las claves. Esto hace que, en la actualidad, la automatización sea difícil.

Podría proporcionar una frase de contraseña a través del argumento de la línea de comandos -N thepassphrase, así que para mantener el símbolo de aparecer. Aún así, ni siquiera deseo tener las claves, adicionalmente aseguradas por cifrado , y quiero que los pares de claves sean de texto sin formato.

¿Cuál es la (la mejor) solución a este problema?

La -qopción que supuestamente significa "silencioso / silencioso" todavía no evita la interacción de frase de contraseña. Además no he encontrado algo como esto
ssh-keygen ...... -q --no-passphrase

Por favor, no comience a predicar sobre mí ni a exponerme sobre los pros y los contras de la "frase de contraseña faltante", soy consciente de eso. En la forma interactiva (no como una secuencia de comandos), el usuario puede simplemente presionar [ENTER] dos veces y la clave se guardará como texto sin formato. Esto es lo que quiero lograr en un script como este:

#! / bin / bash

comando1
comando2
var = $ (comando3)

# esto no debería detener el script y pedir contraseña
ssh-kegen -b 2048 -t rsa -f / tmp / sshkey -q

humanidad y paz
fuente

Respuestas:

105

Esto evitará que aparezca el mensaje de frase de contraseña y establecerá el par de claves para que se almacene en texto sin formato (que por supuesto conlleva todas las desventajas y riesgos de eso):

ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q -N ""
humanidad y paz
fuente
3
Esto funciona. Sin /tmp/sshkeyembargo, en caso de que ya exista, se obtiene un mensaje de sobrescritura. Esto puede evitarse mediante redireccionamiento / cierre de stdin, por ejemplo, mediante la adición 0>&-.
maxschlepzig
34

La forma más simple que encontré para hacer lo que quieres es esto (ejemplo usando el nombre de archivo predeterminado)

    cat /dev/zero | ssh-keygen -q -N ""

Si el ~/.ssh/id_rsaarchivo ya existe, el comando se cerrará sin modificar nada.

Si no, obtienes una clave nueva, en ese nombre de archivo.

De cualquier manera, no ha sobrescrito nada, y sabe que al final tiene una clave.

JoaoCC
fuente
confirmado: en lubuntu 14.04.2
user77115
Si realmente quiere que sea silencioso, canalice la salida a / dev / null:cat /dev/zero | ssh-keygen -q -N "" > /dev/null
Chris Gregg
En (ciertamente antiguo) SLES 11, el comando anterior no produce una clave. yes "" | ssh-keygen -N "" >&- 2>&-Sin embargo, funciona bien y no genera nada (ya sea que exista o no un archivo de claves), y no sobrescribe un archivo de claves previamente existente.
zrajm
Verificado en Ubuntu de confianza (14.04)
Binita Bharati
2
¿Por qué gato / dev / cero?
maxschlepzig
9

Esto funcionó para mí:

ssh-keygen -t rsa -f /home/oracle/.ssh/id_rsa -q -P ""

La -Pes la opción de frase de contraseña y ""es la frase de contraseña vacía.

deslumbrante
fuente
key_save_private: No existe tal archivo o directorio
Dimitri Kopriwa
55
La -P <passphrase>opción es proporcionar la frase de contraseña (antigua). linux.die.net/man/1/ssh-keygen
Gianfranco P.
5

Puede usar esperar para enviar el "enter" por usted

cat test.sh
#!/bin/bash
set -x
XYZ=$(expect -c "
spawn ssh-keygen -b 2048 -t rsa -f /tmp/sshkey -q
expect \"Enter passphrase (empty for no passphrase):\"
send \"\r\"
expect \"Enter same passphrase again:\"
send \"\r\"
")

Pero tenga en cuenta que si el archivo / tmp / sshkey ya existe, fallará porque la salida del comando será diferente.

BitsOfNix
fuente
1
Gracias por la contribucion. la expectativa parece incluso más versátil para problemas del mismo tipo ... bueno, aquellos en los que las secuencias de comandos y la interacción del usuario entrarían en conflicto. Seré consciente del posible conflicto de que / tmp / sshkey ya existe y lo comprobaré antes de usar su comando.
humanityANDpeace
2

Hice un eco simple antes de ssh-keygen. Entoncessu - <user> -c "echo |ssh-keygen -t rsa"

Esto fue probado en Redhat 6

koopsj
fuente
No creo que esta sea la mejor respuesta, pero creo que tampoco hay ninguna razón para rechazar, muchachos.
cubuspl42
0

Para otro usuario, probado en Ubuntu 18.04:

sudo -u username bash -c "ssh-keygen -f /tmp/sshkey -N ''"
Jeroen Vermeulen - MageHost
fuente