【问题标题】:Run system command in ruby and interact with it在 ruby​​ 中运行系统命令并与之交互
【发布时间】:2012-05-25 14:06:30
【问题描述】:

我需要在命令行上运行一个要求用户响应的命令。如果它有帮助,命令是:

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

当你运行它时,它会发出警告,然后询问:

仍然使用这个键吗? (是/否)

响应 '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

我做错了什么?我正在做的事情可能吗?

【问题讨论】:

  • 直截了当的选择是yes | gpg --recipient "Some Name" --encrypt ~/some_file.txt,但这将回答“y”。

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


【解决方案1】:

处理这些情况的 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

【讨论】:

  • 试过了,很完美。谢谢。
  • 没问题...理想情况下,writer.puts('y') 将位于传递给reader.expect 的块中,并且仅在输入匹配时才进行评估,但这并不是库的工作方式。可能想稍微修改一下...
【解决方案2】:

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

如果您实际上对阅读警告不够在意,不妨使用gpg 命令行选项--yes

   --yes  Assume "yes" on most questions.

【讨论】:

  • 我的 gpg 命令中没有 --yes 作为选项。 Mac 和 Ubuntu。
  • 真的吗?你的 Ubuntu 几岁了?甚至hardy version 也将--yes 记录为一个选项...
  • OK 看起来它存在于操作系统级别,但它不会导致问题被回答为“是”。它仍然提示它。在 Mac 上也一样。 (ubuntu 9.10)
猜你喜欢
  • 2015-02-19
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-12
相关资源
最近更新 更多