ssh-keygen接受stdin

时间:2010-04-14 06:42:44

标签: linux bash variables ssh-keys

我尝试使用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 个答案:

答案 0 :(得分:17)

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)

答案 1 :(得分:4)

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

cmd <<< "some $STR here"

如果要将命令的输出重定向为文件,请按以下方式执行:

cmd <( /bin/somecmd )

如果您想将命令用作OUTPUT文件,它或多或少相同:

cmd >( /bin/othercmd )

答案 2 :(得分:4)

自版本7.2(2016-02-28发布)以来,现在可以通过传递-作为文件名来实现。 From the release notes:

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

答案 3 :(得分:0)

以下是使用文件/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 :(得分:-1)

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