表单的进程替换<(...)
将括号中命令的标准输出发送到一个特殊的临时文件,并返回该文件的路径。这样一来,仅将文件名作为参数的命令就可以读取其他命令的输出。您可以通过回显替换来看到这一点:
$ 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':
这意味着它将在第二次尝试打开和读取时获得不同且不完整的数据。因此,在这种情况下,您似乎不能使用进程替换。