ssh-keygen принимает стандартный ввод - PullRequest
20 голосов
/ 14 апреля 2010

Я пытаюсь вызвать ssh-keygen, используя переменную через bash в качестве ввода вместо файла, чтобы получить отпечаток открытого ключа. Я знаю, что мог бы использовать временный файл, чтобы обойти эту проблему, но по причинам, выходящим за рамки этого вопроса, я не хочу.

Этот метод не работает, так как говорит, что файл ключа недействителен (это точно)

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

Этот работает , но не использует переменную, а файл.

ssh-keygen -lf alpha.pub

Этот работает , но не использует переменную, а скорее перенаправленный файл.

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

Это не работает, потому что я получаю неоднозначное перенаправление

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

Буду признателен за понимание того, как заставить ssh-keygen читать переменную с открытым ключом, и, если возможно, объяснение того, почему перенаправления не выполняют то, что, я думаю, они должны делать. В частности, почему | ведет себя не так, как <, и почему третий пример - ambiguous redirect. Я искал в Интернете, но многие из руководств по перенаправлению не отвечали на мои вопросы.

Ответы [ 5 ]

17 голосов
/ 14 апреля 2010
echo $pubkey | ssh-keygen -lf /dev/stdin
/dev/stdin is not a public key file.

/ dev / stdin на самом деле является каналом Unix, а не обычным файлом, поэтому ssh-keygen не может открыть файл

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

/ dev / stdin относится к обычному файлу, созданному с использованием heredoc bash. Вы можете проверить это:

# 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)
4 голосов
/ 08 апреля 2016

Начиная с версии 7.2 (выпущена 2016-02-28), теперь это возможно, передавая - в качестве имени файла. Из заметок о выпуске:

  • ssh-keygen (1): разрешить снятие отпечатков пальцев со стандартного ввода, например ssh-keygen -lf -
4 голосов
/ 14 апреля 2010

Если вы хотите перенаправить строку как стандартный ввод, используйте этот синтаксис:

cmd <<< "some $STR here"

Если вы хотите перенаправить вывод команды, как если бы это был файл, вы делаете это так:

cmd <( /bin/somecmd )

И если вы хотите использовать команду в качестве файла OUTPUT, она более или менее одинакова:

cmd >( /bin/othercmd )
0 голосов
/ 27 апреля 2016

Вот один вкладыш, использующий файл /dev/stdin, как описано в других ответах.

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

Обратите внимание, что это сломается с закрытыми ключами, которые используют парольную фразу. Он будет работать с файлами pem, сгенерированными AWS или OpenStack, которые не используют парольные фразы.

0 голосов
/ 14 апреля 2010

Я бы рекомендовал использовать временный файл. Проблема в том, что при перенаправлении BASH ожидает файл. Используя $ (echo $ pubkey), bash будет жаловаться, потому что, когда это будет сделано с подстановкой, он будет искать файл с тем именем, которое создает подстановка.

...