2012-05-18 40 views
8

我需要在要求用戶響應的命令行上運行命令。在情況下,它可以幫助該命令是:在ruby中運行系統命令並與之交互

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 

我在做什麼錯?我甚至有可能做什麼?

+0

鈍選項是做'是| gpg --recipient「某個名字」--encrypt〜/ some_file.txt',但是它會回答「y」。 –

回答

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 
+0

試過這個,它是完美的。謝謝。 – chrishomer

+0

沒問題......理想情況下,'writer.puts('y')'將被傳遞給'reader.expect',並且只有在輸入匹配時纔會被評估,但這不是圖書館工作的方式。可能想補充一點... –

4

gpg可能是直接打開終端設備詢問用戶的問題 - 這是一種常見的安全方法來防止完全從文件中驅動腳本。 (參見現在不推薦使用getpass(3)程序類似的東西。)

如果你不真正關心不夠有關警告讀它,你還不如使用gpg命令行選項--yes

--yes Assume "yes" on most questions. 
+0

我沒有--yes作爲我的gpg命令中的一個選項。 Mac和Ubuntu。 – chrishomer

+0

真的嗎?你的Ubuntu有多大?即使[hardy版本](http://packages.ubuntu.com/hardy/gnupg)也有'--yes'作爲選項被記錄下來...... – sarnold

+0

好像看起來像它存在於操作系統級別,但它不會導致問題被回答爲「是」。它仍然會提示。在Mac上也一樣。 (Ubuntu 9.10) – chrishomer