【问题标题】:Supply a string variable instead of a filepath as a command line argument提供字符串变量而不是文件路径作为命令行参数
【发布时间】:2013-03-02 16:30:21
【问题描述】:

我想从我的应用程序调用 OpenSSH - 我目前正在使用私有 rsa 密钥文件路径作为参数。

由于安全问题,我不想将 rsa 文件存储在磁盘上 - 有没有办法创建一个临时文件以将 rsa 文件的内容作为字符串变量进行引用?

Bash Process 替代看起来很有希望,并且似乎可以在终端中使用。

所以不要这样:

ssh -N -i /path/to/privatekey.rsa -R 16186:localhost:8888 hello.com

我想做这样的伪代码:

ssh -N -i <("privatekeystuffdis88s8dsf8h8hsd8fh8d") -R 16186:localhost:8888 hello.com

我在 OSX 上。

(顺便说一句,我是从 Objective C 中的 NSTask 调用这一切)

【问题讨论】:

  • “RSA 证书”是什么意思?我认为 SSH 使用密钥对,而不是证书?哦,回答你的问题:根本不要使用ssh;请改用libssh2 并将其全部保存在同一进程中。
  • 对不起,如果我使用了错误的术语 - 是的,它是一对密钥 - 我会编辑。我已经集成了 ssh 但如果没有解决方案我会看看谢谢。
  • 如果它还没有存储在磁盘上,你从哪里获得私钥?
  • 一个安全的 api 调用 - 它返回一个字符串

标签: macos bash command-line posix


【解决方案1】:

Process substitution 形式为&lt;(...) 将括号中命令的标准输出发送到一个特殊的临时文件,并返回该文件的路径。这样一来,仅将文件名作为参数的命令就可以读取其他命令的输出。您可以通过回显替换来看到这一点:

$ echo <(true)
/dev/fd/63

因此,如果您希望该特殊文件的内容是字符串“privatekeystuffdis88s8dsf8h8hsd8fh8d”,您可以这样做:

ssh -N -i <(echo "privatekeystuffdis88s8dsf8h8hsd8fh8d") -R 16186:localhost:8888 hello.com

更新

“特殊临时文件”实际上只是 shell 创建的 pipe(7) 的读取端的文件描述符。 /dev/fd/proc/self/fd 的符号链接,因此在上面的示例中,真正的“文件”实际上是/proc/self/fd/63,在长列表中看起来类似于lr-x------ 1 user group 64 Mar 14 12:26 63 -&gt; pipe:[1955808]

这里重要的是它不是一个常规文件。它是一个命名管道,这意味着一旦从管道中读取数据,它就会从管道中删除。这对您的用例来说是个问题,因为ssh 似乎多次打开/关闭身份文件:

$ strace ssh -vv -n -i ./identity-test some.server true 2>&1 | grep open.*identity-test
open("./identity-test", O_RDONLY)        = 4
open("./identity-test", O_RDONLY)        = 4
Enter passphrase for RSA key './identity-test':

这意味着它在第二次尝试打开和读取时会获得不同且不完整的数据。因此,在这种情况下,您似乎无法使用进程替换。

【讨论】:

  • 非常感谢 - 我现在遇到的问题是我收到错误消息:警告:无法访问身份文件 /dev/fd/63:错误的文件描述符。您认为这是临时身份文件的权限问题吗?如果是,是否可以将临时文件更改为 600?
  • 我更新了我的答案以解释我所说的“特殊临时文件”是什么意思。我还更深入地研究了这种用法,实际上我认为由于与流程替换如何工作有关的技术原因,不可能做你想做的事。
  • 感谢 Chris 提供完整且内容丰富的答案。可惜……我会把 libssh2 作为替代品。
  • 使用 mktemp 的临时文件怎么样?这可以作为一种解决方法吗?
猜你喜欢
  • 2014-04-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2011-04-03
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多