37

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

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

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

ssh --option $STRING user@hostname

其中$STRING包含 的值id_dsa。我需要知道--option是否有一个。

4

3 回答 3

40

尝试以下操作:

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

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

于 2013-04-19T10:42:38.030 回答
15

没有这样的开关——因为它会泄露敏感信息。如果有的话,任何人都可以通过执行一个简单的命令来获取您的私钥。ps

编辑:(因为在评论中添加了详细信息)

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

确保您运行代理(或 OpenSSH 的代理)进程并使用<whatever command you use to fetch it form the database> | ssh-add -

于 2012-08-20T17:47:06.337 回答
2

将加密密钥作为字符串传递是不可取的,但为了这个问题,我会说我遇到了同样的情况,我需要在脚本中将密钥作为字符串传递。我也可以使用存储在文件中的密钥,但脚本的本质是使其非常灵活,包含本身的所有内容是一项要求。所以我曾经分配变量并传递它并按如下方式回显它:

#!/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

这对我有用。

于 2019-05-21T00:06:43.757 回答