2011-01-20 124 views
1

我想通過popen3發送二進制數據,但是出現錯誤。open3 popen3二進制數據

我發出的shell命令是:

key = File.open('path.key').read 
Open3.popen3("openssl pkcs8 -inform DER -outform PEM -passin pass:#{password}") do |stdin, stdout, stderr| 
    stdin.print(key) 
    unless (err = stderr.read).empty? then raise err end 
    stdout.read 
end 

,其中關鍵的是二進制文件。 OpenSSL說這個關鍵是無效的,而我正在撓頭。現在

,如果我具有的OpenSSL發出命令直接從文件系統讀取它,而不是將其通過標準輸入工作正確

"openssl pkcs8 -in path.key -inform DER -outform PEM -passin pass:#{password}" 

是否有編碼問題,我不知道的?或者這是根本不可能的。由於我將通過web服務接收密鑰文件,因此我不必將它們保存到磁盤並使用openssl讀取它們,而是在內存中執行整個過程。

謝謝您的時間

回答

0

試試這個:

Open3.popen3("openssl pkcs8 -inform DER ...") do |stdin, stdout, stderr| 
    stdin.reopen(File.open('path.key', 'rb')) 
    unless (err = stderr.read).empty? then raise err end 
    stdout.read 
end 

而不是把文件讀入一個字符串,重新打開程序的標準輸入是文件。另外,爲了安全起見,請以二進制模式打開它(請注意File.open調用中的rb模式)