提供字符串变量而不是文件路径作为命令行参数

时间:2013-03-14 10:59:04

标签: macos bash command-line posix

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

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

Bash Process subsituition看起来很有希望并且似乎在终端中起作用。

所以不要这样:

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

我想做类似这样的伪代码:

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

我在OSX上。

(顺便说一句,我从目标C中的NSTask中调用了这一切)

1 个答案:

答案 0 :(得分:5)

<(...)形式的

Process substitution将括号中的命令的stdout发送到特殊的临时文件,并返回该文件的路径。这样只有文件名作为参数的命令才能读取其他命令的输出。您可以通过回显替换来看到这一点:

$ 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 -> pipe:[1955808]。< / p>

这里重要的是它不是常规文件。它是一个命名管道,这意味着一旦从管道读取数据,它就会从管道中移除。这是您的用例的问题,因为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':

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