ssh-keygen 接受标准输入
Posted
技术标签:
【中文标题】ssh-keygen 接受标准输入【英文标题】:ssh-keygen accepting stdin 【发布时间】:2011-02-07 18:52:24 【问题描述】:我正在尝试使用通过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 从具有公钥的变量中读取的信息,如果可能的话,解释一下为什么重定向没有按照我认为他们应该做的那样做。具体为什么|
的行为不同于<
以及为什么第三个示例是ambiguous redirect
。我在网上搜索,但许多重定向教程似乎没有回答我的问题。
【问题讨论】:
【参考方案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)
【讨论】:
在 Ubuntu 14.04、Bash 4.3.11、内核 3.13.0-24-generic 上,这不起作用并报告/dev/stdin: Stale file handle
。【参考方案2】:
自 7.2 版(于 2016 年 2 月 28 日发布)以来,现在可以通过传递 -
作为文件名来实现。 From the release notes:
ssh-keygen(1):允许从标准输入进行指纹识别,例如ssh-keygen -lf -
【讨论】:
随着 OpenSSH 7.2 的发布,现在这应该是公认的答案。所以echo $pubkey | ssh-keygen -lf -
,或类似的,是现在要走的路。【参考方案3】:
如果要将字符串重定向为标准输入,请使用以下语法:
cmd <<< "some $STR here"
如果你想像文件一样重定向命令的输出,你可以这样做:
cmd <( /bin/somecmd )
而如果你想使用一个命令作为一个输出文件,它或多或少是一样的:
cmd >( /bin/othercmd )
【讨论】:
所以ssh-keygen -lf /dev/stdin <<< "$pubkey"
可能会做 OP 想要的。【参考方案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 文件。
【讨论】:
【参考方案5】:我建议使用临时文件。问题是重定向,BASH 需要一个文件。通过使用 $(echo $pubkey),bash 会报错,因为当它完成替换时,它会查找替换创建的同名文件。
【讨论】:
以上是关于ssh-keygen 接受标准输入的主要内容,如果未能解决你的问题,请参考以下文章