2009-09-22 3 views
1

open4를 사용하여 키 쌍을 생성하는 약간의 lib를 작성하려고합니다. 여러 프롬프트를 사용하여 시스템 호출을 처리하는 가장 좋은 방법입니까?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 ... 

그 경우는 표준 입력을 읽을 수 있지만 한 번 출력 파일의 암호를하기 만합니다. 그리고 당신이 묻는 질문에 답하기 위해, 네, 시스템 콜이 아니지만 그것은 좋은 방법입니다.

처음에는 프로그램 입력을 가짜로 만들 필요가있는 유닉스 계열 시스템에서는 매우 드뭅니다. openssl(1ssl)genrsa(1ssl) 매뉴얼 페이지를 다시 읽을 수 있습니다. 그들은 다양한 암호 소스 옵션을 기록 할 것입니다.

+0

-passin 또는 -passout이 필요한 것처럼 보이지만 코드가 정상적으로 실행되는 것 같습니다. 감사합니다. – MatthewFord

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