ssh-keygen aceitando stdin
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.
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.