2012-05-18 12 views
8

Necesito ejecutar un comando en la línea de comandos que solicita una respuesta del usuario. En caso de que ayuda el comando es:Ejecutar el comando del sistema en ruby ​​e interactuar con él

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

cuando se ejecuta esto, se advierte sobre algo, entonces se pregunta:

Utilice esta tecla de todos modos? (y/N)

Respondiendo 'y' terminemos correctamente. He intentado usar el open4 gem pero no he podido especificar correctamente la 'y'. Aquí está lo que probé:

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 

¿Qué estoy haciendo mal? ¿Es lo que estoy haciendo posible?

+0

La opción es hacer romo 'sí | gpg --recipient "Some Name" --encrypt ~/some_file.txt', pero que responderá "y" a todo. –

Respuesta

9

La forma de Unix para manejar estas situaciones es con expect, que viene con Rubí built-in support para:

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

Intenté esto y es perfecto. Gracias. – chrishomer

+0

No hay problema ... idealmente 'writer.puts ('y')' estaría en un bloque que pasará a 'reader.expect', y solo se evaluará si la entrada coincide, pero esa no es la forma en que funciona la biblioteca . Puede que quieras retocar un poco ... –

4

gpg probablemente esté abriendo el dispositivo terminal directamente para hacerle al usuario la pregunta: este es un enfoque de seguridad común para evitar que se genere un script completamente a partir de los archivos. (Véase la getpass(3) rutina de ahora en desuso, por algo similar.)

Si en realidad no importa lo suficiente acerca de la advertencia a la leyó, que también podría usar la opción de línea de comandos gpg--yes:

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

No tengo - sí como una opción en mi comando gpg. Tanto Mac como Ubuntu. – chrishomer

+0

¿De verdad? ¿Qué edad tiene tu Ubuntu? Incluso la [versión robusta] (http://packages.ubuntu.com/hardy/gnupg) tiene '--yes' documentado como una opción ... – sarnold

+0

Ok parece que existe en el nivel del sistema operativo, pero no causa la pregunta que debe responderse como "sí". Todavía lo incita. Lo mismo en Mac. (ubuntu 9.10) – chrishomer

Cuestiones relacionadas