Possible to respond to output from system(linuxcommand)

R

Richard Sandoval

Hello,

I have a ruby script that executes a linux command however the command
returns a question:

This will update 1 entry, continue? [y/N]:

I can see this output in when in debug mode for the script. How can I
pass a y and return/enter automatically for each time this question
comes up? I tried to add system(echo y) and puts "\r" to send a y and do
a return but no success. Any pointers?



Here is an example of my small script:

require 'yaml'
require 'nventory'
nvclient = NVentory::Client.new:)dryrun => true, :debug => true, :server
=> 'http://nventory.local')

mdb = YAML::load_file('mdb_dump.yml')
mdb.each_key do |server|
setdata = { :name => "#{server}", :hardware_profile_id => 4, :status_id
=> "#{mdb[server]['status']}"}
nvclient.set_objects('nodes',{},setdata,'jsmith')
end
mdb = YAML::load_file('mdb_dump.yml')
mdb.each_key do |server|
system("opsdb --dry-run --server nventory.local nv --exactget
name=dhcpserver.local --addtonodegroup=temp1,temp2")

system(echo y)
puts "\r"
 
J

Jeremy Bopp

Hello,

I have a ruby script that executes a linux command however the command
returns a question:

This will update 1 entry, continue? [y/N]:

I can see this output in when in debug mode for the script. How can I
pass a y and return/enter automatically for each time this question
comes up? I tried to add system(echo y) and puts "\r" to send a y and do
a return but no success. Any pointers?



Here is an example of my small script:

require 'yaml'
require 'nventory'
nvclient = NVentory::Client.new:)dryrun => true, :debug => true, :server
=> 'http://nventory.local')

mdb = YAML::load_file('mdb_dump.yml')
mdb.each_key do |server|
setdata = { :name => "#{server}", :hardware_profile_id => 4, :status_id
=> "#{mdb[server]['status']}"}
nvclient.set_objects('nodes',{},setdata,'jsmith')
end
mdb = YAML::load_file('mdb_dump.yml')
mdb.each_key do |server|
system("opsdb --dry-run --server nventory.local nv --exactget
name=dhcpserver.local --addtonodegroup=temp1,temp2")

system(echo y)
puts "\r"

The system method runs the child program non-interactively from the
perspective of your script. You'll want to look at IO.popen. That will
run the child and return its stdin and stdout as a duplexed IO object
for you. You can then use something like the expect library (part of
the Ruby standard library) to watch the program's output for the prompt
at which point you can send whatever you like using puts or print on the
IO object popen gave you.

require 'expect'

child_io = IO.popen(<<-BASH, 'r+')
bash -c "
printf 'the prompt> '
read
echo The user typed \\\\\\"\\"\\$REPLY\\"\\\\\\"
"
BASH
child_io.expect('the prompt> ') { child_io.puts 'this is my response' }
puts child_io.read
#-> The user typed "this is my response"

-Jeremy
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,019
Latest member
RoxannaSta

Latest Threads

Top