Ruby open4r несколько системных вызовов с подсказками - PullRequest
1 голос
/ 22 сентября 2009

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

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

Ответы [ 2 ]

1 голос
/ 22 сентября 2009

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

Если вместо этого вы запустите:

openssl genrsa -passout stdin ...

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

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

0 голосов
/ 06 марта 2010

Я обнаружил, что вызов 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

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

in 'write': closed stream (IOError)

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

Другие примеры см. В README: http://github.com/ahoward/open4

...