Having trouble reading from stderr

C

Christopher Rasch

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 (e-mail address removed) -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
 
C

Christopher Rasch

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 (e-mail address removed) -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
 
S

switheyw

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) ....
 

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,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top