1

open4 を使用してキーペアを生成する小さな lib を作成しようとしていますが、これは複数のプロンプトでシステム コールを処理する最良の方法ですか?

require 'rubygems'
require 'open4'
Open4::popen4("sh") do |pid, stdin, stdout, stderr|
  stdin.puts "openssl genrsa -des3 -out tmp_priv.pem 2048" 
  stdin.puts "1234" 
  stdin.puts "1234"
  stdin.close
end
Open4::popen4("sh") do |pid, stdin, stdout, stderr|
  stdin.puts "openssl rsa -in tmp_priv.pem -out tmp_public.pem -outform PEM -pubout"
  stdin.puts "1234"
  stdin.close
end
Open4::popen4("sh") do |pid, stdin, stdout, stderr|
  stdin.puts "cat tmp_priv.pem  tmp_public.pem >> tmp_keypair.pem" 
  stdin.close
end
4

2 に答える 2

1

あなたの例があなたが望むことをするかどうかはわかりません。質問のように実行すると、パイプがopenssl開い/dev/ttyているにもかかわらず、ユーザーにプロンプ​​トが表示されます。は表示されません1234

代わりに実行する場合:

openssl genrsa -passout stdin ...

その場合、標準入力を読み取りますが、出力ファイルのパスワードは一度だけ必要です。そして、あなたが尋ねた質問に答えるには、はい、それは良い方法ですが、システム コールではありません。

また、Unix ライクなシステムでは、そもそもプログラム入力を偽造する必要があることはほとんどありません。openssl(1ssl)およびgenrsa(1ssl)man ページを再読することをお勧めします。彼らは、さまざまな異なるパスワード ソース オプションに注目します。

于 2009-09-22T17:51:41.997 に答える
0

「ブロック」構文で popen4 を呼び出してもうまくいかないことがわかりました。

しかし、私が見つけたのはこれを行うことです:

harp: > cat sample/simple.rb
require "open4"

pid, stdin, stdout, stderr = Open4:open4 "sh"

stdin.puts "echo 42.out"
stdin.puts "echo 42.err 1>&2"
stdin.close

ignored, status = Process::waitpid2 pid

puts "pid : #{ pid }"
puts "stdout : #{ stdout.read.strip }"
puts "stderr : #{ stderr.read.strip }"
puts "status : #{ status.inspect }"
puts "exitstatus : #{ status.exitstatus }"


harp: > ruby sample/simple.rb
pid : 17273
stdout : 42.out
stderr : 42.err
status : #<Process::Status: pid=17273,exited(0)>
exitstatus : 0

標準入力を渡すと機能します。しかし同時に、stdout と stderr も返します。そして、例外を回避しました:

in 'write': closed stream (IOError)

それも。したがって、これが popen4 を使用する最良の方法のようです。

その他の例については、README を参照してください: http://github.com/ahoward/open4

于 2010-03-05T23:08:03.083 に答える