ssh-keygen接受标准输入

30
我试图通过 bash 使用变量作为输入而不是文件来调用 ssh-keygen 以获取公钥指纹。我知道可以使用临时文件解决此问题,但由于本问题的范围原因,我不想这样做。

但是,这种方法并不起作用,因为它显示密钥文件无效(它肯定是正确的)。

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从带有公钥的变量中读取,并如果可能的话,说明为什么重定向没有按照我想要的方式起作用。具体而言,为什么|的行为不同于<,以及第三个示例为什么是模棱两可的重定向。我在网上搜索过,但很多重定向教程似乎没有回答我的问题。

5个回答

21
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
在Ubuntu 14.04上,Bash 4.3.11,内核3.13.0-24-generic上,这个不起作用并报告“/dev/stdin:陈旧的文件句柄”。 - Naftuli Kay

20

自版本7.2(于2016-02-28发布)起,您可以通过将文件名设置为-来实现此功能。 从发行说明中可以看到:

  • ssh-keygen(1):允许从标准输入中获取指纹信息,例如:ssh-keygen -lf -

3
随着OpenSSH 7.2的发布,现在应该接受这个答案了。因此,现在最好的方法是 echo $pubkey | ssh-keygen -lf - 或类似的方式。 - quat

5

以下是使用文件/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文件。

4
如果您想将字符串重定向为标准输入,可以使用以下语法:
cmd <<< "some $STR here"

如果您想将命令的输出重定向到文件中,可以按照以下方式进行操作:

cmd <( /bin/somecmd )

如果你想将命令用作输出文件,操作方式基本相同:

cmd >( /bin/othercmd )

3
那么 ssh-keygen -lf /dev/stdin <<< "$pubkey" 可能就是原帖作者想要的。 - caf
ssh-keygen -lf /dev/stdin <<<"$(memento show)" 对我起作用了。 - Orkhan Alikhanov

-2
我建议使用临时文件。问题在于重定向时,BASH需要一个文件。通过使用$(echo $pubkey),bash会抱怨,因为当它完成替换后,它将寻找该名称的文件,而该替换创建了该文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接