Possible to respond to output from system(linuxcommand)

Discussion in 'Ruby' started by Richard Sandoval, Dec 29, 2010.

  1. 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"

    --
    Posted via http://www.ruby-forum.com/.
     
    Richard Sandoval, Dec 29, 2010
    #1
    1. Advertising

  2. Richard Sandoval

    Adam Ms. Guest

    Adam Ms., Dec 29, 2010
    #2
    1. Advertising

  3. Richard Sandoval

    Jeremy Bopp Guest

    On 12/29/2010 12:36 AM, Richard Sandoval wrote:
    > 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
     
    Jeremy Bopp, Dec 29, 2010
    #3
  4. Adam Ms. wrote in post #971304:
    > Richard Sandoval wrote in post #971231:
    >> Hello,
    >>
    >> snip
    >>
    >> system("opsdb --dry-run --server nventory.local nv --exactget
    >> name=dhcpserver.local --addtonodegroup=temp1,temp2")
    >>
    >> system(echo y)
    >> puts "\r"

    >
    > This might help:
    >
    > http://tech.natemurray.com/2007/03/ruby-shell-commands.html
    >
    > Also, something like this might work:
    >
    > %Q{sh -c 'echo "Y" | yourcomamnd'}


    Or perhaps:

    system("yes | opsdb ... ")

    See "man yes" for info.

    --
    Posted via http://www.ruby-forum.com/.
     
    Brian Candler, Dec 30, 2010
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. ALuPin
    Replies:
    3
    Views:
    1,493
    Mike Treseler
    Jun 18, 2004
  2. Polaris
    Replies:
    1
    Views:
    406
    Alvin Bruney
    Aug 25, 2003
  3. Michael Ramey

    Respond to "delete" events on dynamic controls

    Michael Ramey, Feb 9, 2004, in forum: ASP .Net
    Replies:
    1
    Views:
    372
    Alvin Bruney [MVP]
    Mar 2, 2004
  4. Ken Philips
    Replies:
    0
    Views:
    350
    Ken Philips
    Dec 6, 2004
  5. Pavel Pvl

    system function respond

    Pavel Pvl, Dec 23, 2007, in forum: Ruby
    Replies:
    6
    Views:
    92
    Pavel Pvl
    Dec 23, 2007
Loading...

Share This Page