Pergunta

Estou tentando ligar ssh-keygen usando uma variável através bash como entrada em vez de um arquivo para obter uma impressão digital de uma chave pública. Estou ciente de que poderia usar um arquivo temporário para contornar esse problema, mas, por motivos por escopo dessa pergunta, não quero.

Este método faz não Trabalho como diz que o arquivo chave é inválido (está correto com certeza)

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

este faz trabalho, mas não está usando uma variável, mas um arquivo.

ssh-keygen -lf alpha.pub

este faz trabalho, mas não está usando uma variável, mas um arquivo redirecionado.

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

Isso faz não trabalhar porque eu recebo um redirecionamento ambíguo

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

Eu apreciaria algumas dicas sobre como fazer com que o ssh-keygen leia de uma variável com uma chave pública e, se possível, uma explicação sobre por que os redirecionamentos não estão fazendo o que eu acho que deveriam estar fazendo. Em específico por que o | se comporta de maneira diferente do < E por que o terceiro exemplo é um ambiguous redirect. Eu pesquisei online, mas muitos dos tutoriais de redirecionamento não pareciam responder minhas perguntas.

Foi útil?

Solução

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

/dev/stdin é na verdade um tubo UNIX, não um arquivo regular, então o ssh-keygen falha ao abrir o arquivo

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

/dev/stdin refere -se a um arquivo regular, criado usando um bash heredoc. Você pode verificar isso:

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

Outras dicas

Desde a versão 7.2 (lançado em 2016-02-28), isso agora é possível ao passar - como o nome do arquivo. Das notas de lançamento:

  • ssh-keygen (1): permita a impressão digital de entrada padrão, por exemplo ssh-keygen -lf -

Se você deseja redirecionar uma string como stdin, use esta sintaxe:

cmd <<< "some $STR here"

Se você deseja redirecionar a saída de um comando como se fosse um arquivo, você faz assim:

cmd <( /bin/somecmd )

E se você deseja usar um comando como um arquivo de saída, é mais ou menos o mesmo:

cmd >( /bin/othercmd )

Aqui está um revestimento usando o arquivo /dev/stdin conforme descrito em outras respostas.

$ 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)

Observe que isso quebrará com teclas privadas que usam uma senha. Ele funcionará com arquivos PEM gerados pela AWS ou OpenStack, que não usam sessões.

Eu recomendaria usar um arquivo temporário. A questão é que o redirecionamento, Bash espera um arquivo. Ao usar $ (Echo $ PubKey), o Bash reclamará porque, quando for feito com a substituição, ele procurará um arquivo desse nome que a substituição cria.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top