在ruby中运行系统命令并与之交互

时间:2012-05-18 00:18:06

标签: ruby command-line command-line-interface pgp

我需要在命令行上运行一个命令,要求用户响应。万一它有助于命令:

gpg --recipient "Some Name" --encrypt ~/some_file.txt

当你运行它时,它警告某事然后问:

  

无论如何使用此密钥? (Y / N)

回应'y'让它正确完成。我一直在尝试使用open4 gem但我无法正确指定'y'。这是我试过的:

Open4::popen4(cmd) do |pid, stdin, stdout, stderr|
  stdin.puts "y"
  stdin.close

  puts "pid        : #{ pid }"
  puts "stdout     : #{ stdout.read.strip }"
  puts "stderr     : #{ stderr.read.strip }"
end

我做错了什么?我正在做什么甚至可能?

2 个答案:

答案 0 :(得分:9)

用于处理这些情况的Unix方法是使用expect,Ruby附带built-in support用于:

require 'pty'
require 'expect'

PTY.spawn("your command here") do |reader, writer|
  reader.expect(/Use this key anyway/, 5) # cont. in 5s if input doesn't match
  writer.puts('y')
  puts "cmd response: #{reader.gets}"
end

答案 1 :(得分:4)

gpg可能直接打开终端设备向用户询问问题 - 这是一种常见的安全方法,可以防止脚本完全从文件中驱动。 (有关类似内容,请参阅现已弃用的getpass(3)例程。)

如果您对警告没有足够的关注来阅读它,您也可以使用gpg命令行选项--yes

   --yes  Assume "yes" on most questions.