2012-05-18 9 views
8

Ho bisogno di eseguire un comando sulla riga di comando che richiede una risposta utente. Nel caso in cui aiuta il comando è:Esegui il comando di sistema in ruby ​​e interagisci con esso

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

quando si esegue questo, si mette in guardia su qualcosa, allora chiede:

Utilizzare questo tasto in ogni caso? (s/N)

Risposta 'y' terminiamo correttamente. Ho provato a utilizzare lo open4 gem ma non sono riuscito a farlo correttamente per specificare "y". Ecco cosa ho provato:

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 

Cosa sto facendo male? È quello che sto facendo anche possibile?

+0

L'opzione smussato è quello di fare 'yes | gpg --recipient "Some Name" --encrypt ~/some_file.txt', ma che risponderà "y" a tutto. –

risposta

9

Il modo Unix per gestire queste situazioni è con expect, che viene fornito con rubino built-in support per:

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

Ho provato questo ed è perfetto. Grazie. – chrishomer

+0

Nessun problema ... idealmente 'writer.puts ('y')' sarebbe in un blocco che viene passato a 'reader.expect', e viene valutato solo se l'input corrisponde, ma non è proprio il modo in cui la libreria funziona . Potrei armeggiare un po 'con quello ... –

4

gpg è probabilmente l'apertura del dispositivo terminale direttamente per chiedere all'utente la domanda - questo è un approccio di sicurezza comune per evitare di guidare uno script interamente da file. (Vedere l'ormai deprecato getpass(3) routine per qualcosa di simile.)

Se in realtà non si cura abbastanza circa l'avviso di leggerlo, si potrebbe anche utilizzare l'opzione della riga di comando gpg--yes:

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

Non ho --yes come opzione nel mio comando gpg. Sia Mac che Ubuntu. – chrishomer

+0

Davvero? Quanti anni ha il tuo Ubuntu? Anche la [versione hardy] (http://packages.ubuntu.com/hardy/gnupg) ha '--yes' documentata come opzione ... – sarnold

+0

Ok sembra che esista a livello di SO ma non causa la domanda a cui rispondere come "sì". Lo richiede ancora. Lo stesso su Mac. (ubuntu 9.10) – chrishomer