在SSH中将私钥指定为字符串

时间:2012-08-20 16:44:22

标签: bash ssh

我可以使用-i选项通过SSH连接到服务器以指定私钥:

ssh -i ~/.ssh/id_dsa user@hostname

我正在创建一个从数据库中获取id_dsa文本的脚本,但我不确定如何将该字符串提供给SSH。我需要类似的东西:

ssh --option $STRING user@hostname

$STRING包含id_dsa的值。我需要知道--option是否有。{/ p>

3 个答案:

答案 0 :(得分:31)

尝试以下方法:

echo $KEY | ssh -i /dev/stdin username@host command

密钥不会出现在PS语句中,但由于stdin被重定向,因此仅对单个命令或隧道有用。

答案 1 :(得分:10)

没有这样的转换 - 因为它会泄漏敏感信息。如果有,任何人都可以通过执行简单的ps命令来获取私有密钥。

编辑 :(由于评论中添加了详细信息)

您确实应该将密钥存储到临时文件中。如果不使用mktemp之类的命令创建临时文件,请确保在写入文件之前正确设置权限。

<击> 确保运行代理(或OpenSSH情况下的代理)进程并使用<whatever command you use to fetch it form the database> | ssh-add -加载密钥

答案 2 :(得分:0)

不建议将密码密钥作为字符串传递,但是出于问题的考虑,我会遇到同样的情况,我需要在脚本中将密钥作为字符串传递。我也可以使用存储在文件中的密钥,但是脚本的本质是使其变得非常灵活,它本身包含所有内容。所以我过去常常给变量赋值并传递它,并如下所示:

#!/bin/bash
KEY="${ YOUR SSH KEY HERE INSIDE }"
echo "${KEY}" | ssh -q -i /dev/stdin username@IP 'hostnamectl'
exit 0

注意:  -q取消所有警告

顺便说一句,上面脚本中的内容,由于我们正在使用echo,它将打印ssh密钥,再次不推荐这样做,以隐藏您可以使用grep来grep某些肯定不会打印的东西,但是stdin仍然具有回显中的值。因此,最终的cmd可以进行如下修改:

#!/bin/bash
KEY="${ YOUR SSH KEY HERE INSIDE }"
echo "${KEY}" | grep -qw "less" | ssh -q -i /dev/stdin username@IP 'hostnamectl'
exit 0

这对我有用。