Недавно я потратил немало времени на борьбу с этой проблемой (я застрял с 1.8.7).Я нашел этот вопрос , этот пост в блоге и эту ветку форума действительно полезным.
В конце это код моего приложения, если кто-тоинтересует небольшой пример (при подписывании пакетов передайте пароль в rpm):
def run_interactive command, password, promt
output = ''
begin
r, w, pid = PTY.spawn(command)
puts r.expect(promt)
sleep(0.5)
w.puts(password)
begin
r.each { |l| output += l }
rescue Errno::EIO
end
$?.exitstatus
Process.wait(pid)
rescue PTY::ChildExited => e
$stderr.puts "The child process #{e} exited! #{$!.status.exitstatus}"
end
output
end
password = "mypassword"
command = "rpm --define '_signature gpg' --define '_gpg_name #{key_id}' --addsign #{package}"
promt = %r{.*: }
expected = %r{good}
output = run_interactive(command, password, promt)
if output.match(expected)
puts output
else
abort "Error: expected: '#{expected}' got '#{output}'"
end
В нем мало проверок на ошибки, но это все, что мне нужно.
Редактировать: обновить код с помощью Process.wait(pid)
, чтобы убедиться, что он заканчивается, прежде чем продолжить, и добавьте комментарий об этом для 1.8.7.