2010-04-14 15 views
17

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

Este método hace no trabajo, ya que dice que el archivo de la clave no es válido (que es correcto para asegurarse)

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

Este hace trabajo, pero no está utilizando una variable, en lugar de un archivo.

ssh-keygen -lf alpha.pub 

Esto hace trabajo, pero no es el uso de una variable, en lugar de un archivo redirigido.

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

Esto hace no trabajo porque consigo una redirección ambigua

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

Le agradecería alguna idea de cómo conseguir ssh-keygen para leer de una variable con una clave pública y si posible, una explicación de por qué los redireccionamientos no están haciendo lo que creo que deberían estar haciendo. En específico, por qué el | se comporta de manera diferente que el < y por qué el tercer ejemplo es un ambiguous redirect. Busqué en línea, pero muchos de los tutoriales de redirección no parecen responder mis preguntas.

Respuesta

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

/dev/stdin es en realidad un tubo de UNIX, no es un archivo regular, por lo ssh-keygen no se abre el archivo

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

/dev/stdin se refiere a un archivo normal, creada mediante el uso de un heredoc fiesta . Esto se puede comprobar:

# 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) 
+1

En Ubuntu 14.04, Bash 4.3.11, kernel 3.13.0-24-generic, esto no funciona e informa '/ dev/stdin: archivo obsoleto handle'. –

+4

No funciona en Mac. – Will

-1

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

3

Si desea redirigir una cadena como entrada estándar, utilice esta sintaxis:

cmd <<< "some $STR here" 

Si desea redirigir la salida de un comando como si fuera un archivo, lo haces de esta manera:

cmd <(/bin/somecmd) 

Y si desea utilizar un comando como un archivo de salida, que es más o menos lo mismo:

cmd >(/bin/othercmd) 
+1

Así 'ssh-keygen -lf/dev/stdin <<<" $ pubkey "' probablemente haga lo que el OP quiere entonces. – caf

+0

@caf: Esa forma funciona para mí. –

2

Desde la versión 7.2 (publicado el 02/28/2016 en), esto es ahora posible mediante el paso - como nombre de archivo. From the release notes:

  • ssh-keygen (1): permitir que las huellas digitales de la entrada estándar, por ejemplo,ssh-keygen -lf -
+0

Con el lanzamiento de OpenSSH 7.2, esta debería ser la respuesta aceptada. Entonces 'echo $ pubkey | ssh-keygen -lf -', o similar, es el camino a seguir ahora. – quat

0

Aquí es un un trazador de líneas utilizando 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 romperá con las claves privadas que utilizan una frase de contraseña. Funcionará con los archivos de pem generados por AWS o OpenStack que no usan frases de contraseña.