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

rta*_*oni 24 ssh bash

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

ssh -i ~/.ssh/id_dsa user@hostname
Run Code Online (Sandbox Code Playgroud)

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

ssh --option $STRING user@hostname
Run Code Online (Sandbox Code Playgroud)

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

小智 32

请尝试以下方法:

echo $KEY | ssh -i /dev/stdin username@host command
Run Code Online (Sandbox Code Playgroud)

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

  • 这只给了我:```@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ dev/stdin'的权限0660太开放了.其他人无法访问您的私钥文件.此私钥将被忽略.加载密钥"/ dev/stdin":错误权限权限被拒绝(publickey).``` (4认同)
  • 无法使用 ssh 6.9p1:不会分配伪终端,因为 stdin 不是终端。 (2认同)
  • 另请注意,如果您逐字地使用此键,将$ KEY替换为您的实际键,您将通过shell的历史记录泄漏它.密钥应该来自stdin,而不是来自shell. (2认同)

Kim*_*ais 11

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

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

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

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

  • 我不确定我是否理解你的第二段.我不想要任何代理人参与.我在Ruby应用程序中使用ssh shell命令,其中我有一个关联公钥和私钥的基础结构.使用从基础结构记录中获取的私钥,我想在远程主机上连接并运行命令.这就是为什么我想将私钥保存在基础设施的记录中.但最好存储文件的路径并将路径传递给ssh命令. (3认同)
  • @rtacconi您可以实现[ssh-agent protocol](http://api.libssh.org/rfc/PROTOCOL.agent). (2认同)
  • 我不同意这种观点。我认为瞬态数据总是比永久数据更安全。使用正确的工具,仍然可以读取大多数删除的文件。我正在寻找一种解决方案,该解决方案从服务器接收密钥,并在CI流程中即时使用它们。也许外壳是错误的工具? (2认同)