ssh-keygen接受stdin

我试图调用ssh-keygen使用variables通过bash作为input,而不是文件来获取公钥的指纹。 我知道我可以使用一个临时文件来解决这个问题,但由于这个问题的范围之外的原因,我不想。

这种方法不起作用,因为它说密钥文件是无效的(这是肯定的)

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

确实有效,但不是使用variables,而是使用文件。

 ssh-keygen -lf alpha.pub 

行得通的,但不是使用variables,而是redirect的文件。

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

这不起作用,因为我得到一个模棱两可的redirect

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

我将不胜感激有关如何让ssh-keygen从带有公钥的variables中读取信息,以及如果可能的话,解释为什么redirect没有做我认为应该做的事情。 具体为什么| 行为不同于<以及为什么第三个例子是一个ambiguous redirect 。 我在网上search,但许多redirect教程似乎没有回答我的问题。

Solutions Collecting From Web of "ssh-keygen接受stdin"

 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) 

如果你想重定向一个字符串作为标准输入,使用下面的语法:

 cmd <<< "some $STR here" 

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

 cmd <( /bin/somecmd ) 

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

 cmd >( /bin/othercmd ) 

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

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

这里是一个使用文件/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文件一起使用。

我会建议使用临时文件。 问题是重定向,BASH期待一个文件。 通过使用$(echo $ pubkey),bash将会抱怨,因为当它完成替换时,它将查找替换创建的名称的文件。