3

我想从我的应用程序中调用 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 上。

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

4

1 回答 1

5

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

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

因此,如果您希望该特殊文件的内容是字符串“privatekeystuffdis88s8dsf8h8hsd8fh8d”,您需要执行以下操作:

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

更新

pipe(7)“特殊临时文件”实际上只是外壳创建 的读取端的文件描述符。/dev/fd是 的符号链接/proc/self/fd,所以在上面的例子中,真正的“文件”实际上是/proc/self/fd/63,它看起来像lr-x------ 1 user group 64 Mar 14 12:26 63 -> 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':

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

于 2013-03-14T13:47:34.023 回答