2013-03-14 45 views
3

我想從我的應用程序調用OpenSSH - 我正在使用專用rsa密鑰文件路徑作爲參數。提供字符串變量而不是文件路徑作爲命令行參數

由於安全問題,我不想在光盤上存儲rsa文件 - 有沒有辦法創建一個臨時文件作爲字符串變量引用rsa文件的內容?

Bash過程子公司看起來很有前景,似乎在終端工作。

因此,不是這樣的:

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

我願做這樣的事情的僞代碼:

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

我在OSX。

(作爲一旁我打電話這一切從NSTask在目標C)

+1

你是什麼意思的「RSA證書」?我以爲SSH使用密鑰對,而不是證書?哦,並回答你的問題:不要使用'ssh';改爲使用'libssh2',並將它保留在同一個進程中。 – trojanfoe 2013-03-14 11:00:55

+0

對不起,如果我使用了錯誤的術語 - 是的,這是一對鑰匙 - 我會編輯。我已經集成了ssh,但如果沒有解決方案,我會看看謝謝。 – petenelson 2013-03-14 11:37:18

+0

如果私鑰尚未存儲在磁盤上,您將從哪裏獲得私鑰? – chepner 2013-03-14 12:50:23

回答

4

形式<(...)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': 

這意味着它會得到不同的,不完整的數據它試圖打開和閱讀的第二次。所以在這種情況下看起來你不能使用進程替換。

+1

非常感謝 - 我現在遇到的問題是我得到的錯誤:警告:身份文件/ dev/fd/63無法訪問:錯誤的文件描述符。你認爲這是臨時身份文件的權限問題 - 如果是的話,是否可以將臨時文件chmod改爲600? – petenelson 2013-03-14 15:39:24

+1

我更新了我的答案,以解釋「特殊臨時文件」的含義。我還深入挖掘了這種用法,實際上我不認爲有可能因技術原因而需要進行流程替換的工作。 – 2013-03-14 17:11:55

+1

感謝Chris提供的全面和翔實的答案。可惜我......我會看看libssh2作爲替代品。 – petenelson 2013-03-14 22:39:49

相關問題