我可以使用-i选项通过SSH连接到服务器以指定私钥:
ssh -i ~/.ssh/id_dsa user@hostname
我正在创建一个从数据库中获取id_dsa
文本的脚本,但我不确定如何将该字符串提供给SSH。我需要类似的东西:
ssh --option $STRING user@hostname
$STRING
包含id_dsa
的值。我需要知道--option
是否有。{/ p>
答案 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
这对我有用。