open3 popen3二进制数据

时间:2011-01-20 23:27:18

标签: ruby

我正在尝试通过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

其中key是二进制文件。 OpenSSL说密钥无效,我正在摸不着头脑。

现在,如果我通过让OpenSSL直接从文件系统读取它而不是通过标准输入传递它来发出命令它可以正常工作

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

是否存在我不知道的编码问题?或者这根本不可能。由于我将通过web服务接收密钥文件,我宁愿不必将它们保存到磁盘并让openssl读取它们,而是在内存中完成整个过程。

感谢您的时间

1 个答案:

答案 0 :(得分: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

不是将文件读入字符串,而是重新打开进程的stdin作为文件。另外,为了安全起见,请以二进制模式打开它(请注意rb调用中的File.open模式)