keys keygen gen examples create linux bash variables ssh-keys

keygen - ssh keys linux



ssh-keygen aceptando stdin (5)

Aquí hay una sola línea que usa el archivo /dev/stdin como se describe en otras respuestas.

$ ssh-keygen -lf /dev/stdin <<< $( ssh-keygen -f ~/.ssh/keyname.pem -y ) 2048 14:df:c7:b7:f1:26:7f:87:d5:e7:10:6c:ac:af:a2:03 /dev/stdin (RSA)

Tenga en cuenta que esto se interrumpirá con las claves privadas que usan una frase de contraseña. Funcionará con archivos pem generados por AWS u OpenStack que no usan frases de contraseña.

Estoy tratando de llamar a ssh-keygen usando una variable a través de bash como una entrada en lugar de un archivo para obtener una huella digital de una clave pública. Soy consciente de que podría usar un archivo temporal para solucionar este problema, pero por razones fuera del alcance de esta pregunta, no quiero hacerlo.

Este método no funciona porque dice que el archivo de clave no es válido (seguro que es correcto)

echo $pubkey | ssh-keygen -lf /dev/stdin

Esto funciona, pero no usa una variable, sino un archivo.

ssh-keygen -lf alpha.pub

Esto funciona, pero no usa una variable, sino un archivo redirigido.

ssh-keygen -lf /dev/stdin < alpha.pub

Esto no funciona porque obtengo un redireccionamiento ambiguo.

ssh-keygen -lf /dev/stdin < $(echo $pubkey)

Apreciaría tener una idea de cómo hacer que ssh-keygen lea desde una variable con una clave pública y, si es posible, una explicación de por qué los redireccionamientos no están haciendo lo que creo que deberían hacer. En concreto por qué el | se comporta de manera diferente a < y por eso el tercer ejemplo es una ambiguous redirect . Busqué en línea, pero muchos de los tutoriales de redireccionamiento no parecieron responder mis preguntas.


Desde la versión 7.2 (lanzada el 2016-02-28), esto ahora es posible pasando - como el nombre del archivo. De las notas de publicación:

  • ssh-keygen (1): permite la toma de huellas dactilares desde la entrada estándar, por ejemplo, ssh-keygen -lf -

Si desea redireccionar una cadena como stdin, use esta sintaxis:

cmd <<< "some $STR here"

Si desea redirigir la salida de un comando como si fuera un archivo, hágalo así:

cmd <( /bin/somecmd )

Y si desea usar un comando como un archivo de SALIDA, es más o menos lo mismo:

cmd >( /bin/othercmd )


Yo recomendaría usar un archivo temporal. El problema es que al redireccionar, BASH espera un archivo. Al usar $ (echo $ pubkey), bash se quejará porque cuando haya terminado con la sustitución, buscará un archivo con ese nombre que creará la sustitución.


echo $pubkey | ssh-keygen -lf /dev/stdin /dev/stdin is not a public key file.

/ dev / stdin es en realidad una canalización de Unix, no un archivo normal, por lo que ssh-keygen no puede abrir el archivo

ssh-keygen -lf /dev/stdin <<<$key 1024 92:6a:3f:5c:1f:78:.....

/ dev / stdin se refiere a un archivo regular, creado mediante el uso de un bash heredoc. Puedes verificar esto:

# ls -l /dev/stdin <<<$pubkey lrwxrwxrwx 1 root root 15 Feb 11 08:07 /dev/stdin -> /proc/self/fd/0 # ls -l /proc/self/fd/0 <<<$pubkey lr-x------ 1 juergen juergen 64 Apr 14 13:31 /proc/self/fd/0 -> /tmp/sh-thd-1271250023 (deleted)