Подтвердить что ты не робот

Ssh-keygen принимает stdin

Я пытаюсь вызвать 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. Я искал в Интернете, но многие из учебников по перенаправлению, похоже, не отвечали на мои вопросы.

4b9b3361

Ответ 1

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 ссылается на обычный файл, созданный с помощью bash heredoc. Вы можете проверить это:

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

Ответ 2

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

cmd <<< "some $STR here"

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

cmd <( /bin/somecmd )

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

cmd >( /bin/othercmd )

Ответ 3

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

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

Ответ 4

Вот один лайнер, используя файл /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, которые не используют кодовые фразы.

Ответ 5

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