形式<(...)
的Process substitution發送括號到一個特殊的臨時文件中的命令的標準輸出,和路徑返回到該文件。這使得只將文件名作爲參數的命令可以讀取其他命令的輸出。您可以通過只echo'ing替代看到這一點:
$ echo <(true)
/dev/fd/63
所以,如果你想要一個特殊文件的內容是字符串「privatekeystuffdis88s8dsf8h8hsd8fh8d」,你會想做的事:
ssh -N -i <(echo "privatekeystuffdis88s8dsf8h8hsd8fh8d") -R 16186:localhost:8888 hello.com
UPDATE
「特殊臨時文件」實際上只是由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]
。
這裏重要的是它不是一個普通的文件。它是一個命名管道,這意味着一旦從管道中讀取數據,它就會從管道中移除。這是你的用例的問題,因爲它似乎是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':
這意味着它會得到不同的,不完整的數據它試圖打開和閱讀的第二次。所以在這種情況下看起來你不能使用進程替換。
你是什麼意思的「RSA證書」?我以爲SSH使用密鑰對,而不是證書?哦,並回答你的問題:不要使用'ssh';改爲使用'libssh2',並將它保留在同一個進程中。 – trojanfoe 2013-03-14 11:00:55
對不起,如果我使用了錯誤的術語 - 是的,這是一對鑰匙 - 我會編輯。我已經集成了ssh,但如果沒有解決方案,我會看看謝謝。 – petenelson 2013-03-14 11:37:18
如果私鑰尚未存儲在磁盤上,您將從哪裏獲得私鑰? – chepner 2013-03-14 12:50:23