Having trouble reading from stderr

Discussion in 'Ruby' started by Christopher Rasch, Feb 26, 2008.

  1. Hi,

    I'm trying to write a script that will establish an ssh tunnel through
    "gatewaymachine.com" to a "targetmachine" on the other side. Sometimes
    there's already a tunnel established on the same port, in which case,
    the command fails with an error message.

    I'd like to be able to read the error message from the script. If the
    script failed due to an incorrect port number, I'd like increment the
    port number and try again.

    Based on my google search, the popen3 command from the open3 library is
    what I want to use.

    But when I try to read from stderr, the read command never returns.
    Here's the code:



    require 'open3'

    stdin, stdout, stderr = Open3.popen3("ssh -i
    /Users/crasch/.ssh/id_rsa.pub -L 2222:targetmachine:22 -N")

    puts stderr.read <---hangs indefinitely here


    Any suggestions for what might be happening? Thanks for any suggestions
    you may wish to provide.

    Chris
     
    Christopher Rasch, Feb 26, 2008
    #1
    1. Advertising

  2. Christopher Rasch

    Arlen Cuss Guest

    [Note: parts of this message were removed to make it a legal post.]

    Hey,

    Check out the Net::SSH module. It'll probably do what you want.

    http://net-ssh.rubyforge.org/

    Comes with Ruby, if I'm not mistaken.

    Cheers,
    Arlen.
     
    Arlen Cuss, Feb 26, 2008
    #2
    1. Advertising

  3. Christopher Rasch

    Guest

    The fix is simple - replace 'read' with 'gets', ie, puts stderr.gets.



    On Feb 25, 7:49 pm, Christopher Rasch <> wrote:
    > Hi,
    >
    > I'm trying to write a script that will establish an ssh tunnel through
    > "gatewaymachine.com" to a "targetmachine" on the other side. Sometimes
    > there's already a tunnel established on the same port, in which case,
    > the command fails with an error message.
    >
    > I'd like to be able to read the error message from the script. If the
    > script failed due to an incorrect port number, I'd like increment the
    > port number and try again.
    >
    > Based on my google search, the popen3 command from the open3 library is
    > what I want to use.
    >
    > But when I try to read from stderr, the read command never returns.
    > Here's the code:
    >
    > require 'open3'
    >
    > stdin, stdout, stderr = Open3.popen3("ssh -i
    > /Users/crasch/.ssh/id_rsa.pub -L 2222:targetmachine:22 -N")
    >
    > puts stderr.read <---hangs indefinitely here
    >
    > Any suggestions for what might be happening? Thanks for any suggestions
    > you may wish to provide.
    >
    > Chris
     
    , Feb 26, 2008
    #3
  4. Thanks! However, stderr.gets hangs as well. Here's what the irb session looks like:

    irb(main):001:0> require 'open3'
    => true
    irb(main):002:0> stdin, stdout, stderr = Open3.popen3("ssh -i /Users/crasch/.ssh/id_rsa.pub -L
    2222:targetmachine:22 -N")
    => [#<IO:0x10c0534>, #<IO:0x10c04f8>, #<IO:0x10c0494>]
    irb(main):003:0> stderr.gets <--- hangs here


    Could it be that stderr has received a partial error message, but won't write anything out until it receives a signal
    that ssh process has ended?

    Chris





    wrote:
    > The fix is simple - replace 'read' with 'gets', ie, puts stderr.gets.
    >
    >
    >
    > On Feb 25, 7:49 pm, Christopher Rasch <> wrote:
    >> Hi,
    >>
    >> I'm trying to write a script that will establish an ssh tunnel through
    >> "gatewaymachine.com" to a "targetmachine" on the other side. Sometimes
    >> there's already a tunnel established on the same port, in which case,
    >> the command fails with an error message.
    >>
    >> I'd like to be able to read the error message from the script. If the
    >> script failed due to an incorrect port number, I'd like increment the
    >> port number and try again.
    >>
    >> Based on my google search, the popen3 command from the open3 library is
    >> what I want to use.
    >>
    >> But when I try to read from stderr, the read command never returns.
    >> Here's the code:
    >>
    >> require 'open3'
    >>
    >> stdin, stdout, stderr = Open3.popen3("ssh -i
    >> /Users/crasch/.ssh/id_rsa.pub -L 2222:targetmachine:22 -N")
    >>
    >> puts stderr.read <---hangs indefinitely here
    >>
    >> Any suggestions for what might be happening? Thanks for any suggestions
    >> you may wish to provide.
    >>
    >> Chris

    >
    >
    >
    >
    >
    >
     
    Christopher Rasch, Feb 26, 2008
    #4
  5. Christopher Rasch

    Guest

    After I generated my own key file and ran your example (except with
    gets) and with my key file, the system waited for a few Minutes and
    generated this:

    poplar% time ./x.rb
    ssh: connect to host gatewaymachine.com port 22: Operation timed out

    ../x.rb 0.00s user 0.01s system 0% cpu 2:14.79 total


    If nothing is able to be read from stderr, I suppose the read/gets
    call will hang - you might want to put the read of stderr in a
    thread. Something like this:

    Thread.new { loop { puts "Err stream: #{stderr.gets}" } }

    you can always receive a partial msg by placing the number of bytes to
    read in the read call, ie stderr.read(5) ....
     
    , Feb 26, 2008
    #5
    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. Priya
    Replies:
    0
    Views:
    348
    Priya
    Nov 25, 2003
  2. Replies:
    0
    Views:
    327
  3. Replies:
    0
    Views:
    593
  4. Replies:
    7
    Views:
    1,052
    red floyd
    Jul 17, 2005
  5. spidey12345
    Replies:
    2
    Views:
    581
    ashani
    Oct 23, 2006
Loading...

Share This Page