2009-09-22 10 views
1

Я пытаюсь написать небольшую библиотеку, которая генерирует пару ключей с помощью open4, является ли это лучшим способом иметь дело с системными вызовами с несколькими подсказками?Ruby open4r несколько системных вызовов с подсказками

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 
+0

спросив вокруг кажется это нормально способ пойти об этом, кто-нибудь есть какие-либо другие методы? – MatthewFord

ответ

1

Я не уверен, что ваш пример будет делать то, что вы хотите. Если вы запустите как в своем вопросе openssl, то откроется /dev/tty, и он в конечном итоге подскажет пользователю, несмотря на трубку. Он не увидит 1234.

Если вместо запуска:

openssl genrsa -passout stdin ... 

, то в этом случае он будет читать со стандартного ввода, но это нужно будет только пароль выходного файла один раз. И чтобы ответить на заданный вами вопрос, да, это хороший способ, хотя это не системный вызов.

Это также довольно редко встречается в Unix-подобных системах, чтобы в первую очередь подделать ввод программ. Возможно, вы захотите перечитать справочные страницы openssl(1ssl) и genrsa(1ssl); они будут учитывать различные варианты источника пароля.

+0

Код, кажется, работает отлично, хотя, хотя -passin или -passout, похоже, что мне нужно, спасибо – MatthewFord

0

Я обнаружил, что вызов popen4 с синтаксисом «block» просто не работает.

Но что я нашел работу, чтобы сделать это:

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 

, который будет работать с принятием стандартного ввода. Но в то же время, также отдавая выступление и stderr. И это исключало исключение:

in 'write': closed stream (IOError) 

тоже. Таким образом, это лучший способ использовать popen4.

Для других примеров смотрите README: http://github.com/ahoward/open4