2011-01-20 89 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模式)