26

我试图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. 我在网上搜索,但许多重定向教程似乎没有回答我的问题。

4

5 回答 5

20
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)
于 2010-04-14T11:33:36.630 回答
15

自 7.2 版(于 2016-02-28 发布)以来,现在可以通过-作为文件名传递。从发行说明:

  • ssh-keygen(1):允许从标准输入进行指纹识别,例如ssh-keygen -lf -
于 2016-04-08T07:01:31.087 回答
4

如果要将字符串重定向为标准输入,请使用以下语法:

cmd <<< "some $STR here"

如果你想像文件一样重定向命令的输出,你可以这样做:

cmd <( /bin/somecmd )

如果你想使用一个命令作为一个 OUTPUT 文件,它或多或少是一样的:

cmd >( /bin/othercmd )
于 2010-04-14T07:01:40.953 回答
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)

请注意,这将与使用密码的私钥中断。它适用于 AWS 或 OpenStack 生成的不使用密码短语的 pem 文件。

于 2016-04-27T02:39:52.953 回答
-2

我建议使用临时文件。问题是重定向,BASH 需要一个文件。通过使用 $(echo $pubkey),bash 会报错,因为当它完成替换时,它会查找替换创建的同名文件。

于 2010-04-14T06:55:36.320 回答