Trying to Use "request_pty" Channel Never Closes

Discussion in 'Ruby' started by Nathan Halterman, Nov 4, 2008.

  1. I'm trying to interact with a RF Terminal application. But each time I
    run this, it returns nothing from stdout, and just hangs irb. I've been
    banging my head on this one for a couple days, because it seems right,
    but nothing comes back from the server.

    Any ideas? Thanks in advance. :)

    Code:
    def test_rf(run_this)
    
    Net::SSH.start('xx.xx.xx.xx', 'userid', :password => "password")  do
    |session|
    
    session.open_channel do |channel|
    channel.request_pty(:term => 'xterm') do |ch, success|
    raise "could not request pty!" unless success
    channel.send_data "2\n" # tell the shell to exit
    end
    puts "shell was started successfully!"
    channel.send_data "2\n" # tell the shell to exit
    sleep 3
    channel.send_data "1\n" # tell the shell to exit
    sleep 2
    channel.send_data "Canada6-gen\t"
    channel.send_data "Canada6-gen\t"
    channel.send_data "\n"
    channel.send_data "<ESC>0"
    channel.send_data "2\n"
    channel.send_data "0\n"
    
    channel.on_data do |ch, data|
    puts "got data: #{data.inspect}"
    end
    channel.on_close do
    puts "shell terminated"
    end
    
    end
    
    session.loop
    
    end
    
    end #test_rf
    
    --
    Posted via http://www.ruby-forum.com/.
    Nathan Halterman, Nov 4, 2008
    #1
    1. Advertising

  2. Nathan Halterman, Nov 4, 2008
    #2
    1. Advertising

  3. Nathan Halterman

    Hugh Sasse Guest

    On Wed, 5 Nov 2008, Nathan Halterman wrote:

    > I'm trying to interact with a RF Terminal application. But each time I
    > run this, it returns nothing from stdout, and just hangs irb. I've been
    > banging my head on this one for a couple days, because it seems right,
    > but nothing comes back from the server.
    >
    > Any ideas? Thanks in advance. :)


    While you're waiting for someone who knows Net::ssh to reply, I'd add
    LOTS more diagnostics:
    >
    >
    Code:
    >   def test_rf(run_this)
    >
    >     Net::SSH.start('xx.xx.xx.xx', 'userid', :password => "password")  do
    > |session|
    >
    >       session.open_channel do |channel|
    >         channel.request_pty(:term => 'xterm') do |ch, success|
    >           raise "could not request pty!" unless success[/color]
    +          puts "about to send 2\\n"
    # channel.send_data "2\n" # tell the shell to exit
    x = channel.send_data "2\n" # tell the shell to exit
    puts "sent, the result was #{x}"[color=blue]
    >         end
    >         puts "shell was started successfully!"
    >         channel.send_data "2\n" # tell the shell to exit
    >         sleep 3
    >         channel.send_data "1\n" # tell the shell to exit
    >         sleep 2
    >         channel.send_data "Canada6-gen\t"
    >         channel.send_data "Canada6-gen\t"
    >         channel.send_data "\n"
    >         channel.send_data "<ESC>0"
    >         channel.send_data "2\n"
    >         channel.send_data "0\n"
    >
    >         channel.on_data do |ch, data|
    >           puts "got data: #{data.inspect}"
    >         end
    >         channel.on_close do
    >           puts "shell terminated"
    >         end
    >
    >       end[/color]
    puts "session.open_channel completed, about to call loop"[color=blue]
    >
    >       session.loop[/color]
    puts "got past loop statement"[color=blue]
    >
    >     end[/color]
    puts "Net ssh start completed.[color=blue]
    >
    >   end #test_rf
    > 
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    Hugh Sasse, Nov 4, 2008
    #3
  4. Thanks, that got me a little more information. The output was this.

    [snip]

    Net ssh start completed.
    session.open_channel completed, about to call loop
    about to send 2\n
    sent, the result was 2

    [/snip]

    Hugh Sasse wrote:
    > On Wed, 5 Nov 2008, Nathan Halterman wrote:
    >
    >> I'm trying to interact with a RF Terminal application. But each time I
    >> run this, it returns nothing from stdout, and just hangs irb. I've been
    >> banging my head on this one for a couple days, because it seems right,
    >> but nothing comes back from the server.
    >>
    >> Any ideas? Thanks in advance. :)

    >
    > While you're waiting for someone who knows Net::ssh to reply, I'd add
    > LOTS more diagnostics:
    >>
    >>
    Code:
    >>   def test_rf(run_this)
    >>
    >>     Net::SSH.start('xx.xx.xx.xx', 'userid', :password => "password")  do
    >> |session|
    >>
    >>       session.open_channel do |channel|
    >>         channel.request_pty(:term => 'xterm') do |ch, success|
    >>           raise "could not request pty!" unless success[/color]
    >  +          puts "about to send 2\\n"
    >             # channel.send_data "2\n" # tell the shell to exit
    >             x = channel.send_data "2\n" # tell the shell to exit
    >             puts "sent, the result was #{x}"[color=green]
    >>         channel.send_data "2\n"
    >>         channel.send_data "0\n"
    >>
    >>         channel.on_data do |ch, data|
    >>           puts "got data: #{data.inspect}"
    >>         end
    >>         channel.on_close do
    >>           puts "shell terminated"
    >>         end
    >>
    >>       end[/color]
    >         puts "session.open_channel completed, about to call loop"[color=green]
    >>
    >>       session.loop[/color]
    >         puts "got past loop statement"[color=green]
    >>
    >>     end[/color]
    >       puts "Net ssh start completed.[/color]
    
    --
    Posted via http://www.ruby-forum.com/.
    Nathan Halterman, Nov 4, 2008
    #4
  5. OOOOOkaaaaay. :)

    So it turns out that it was a timing issue. I was sending the
    channel.on_data too fast for the UI to process. I added in some sleep
    statements and it worked.

    Thanks a ton! :)
    --
    Posted via http://www.ruby-forum.com/.
    Nathan Halterman, Nov 4, 2008
    #5
  6. Nathan Halterman

    Hugh Sasse Guest

    On Wed, 5 Nov 2008, Nathan Halterman wrote:

    > OOOOOkaaaaay. :)
    >
    > So it turns out that it was a timing issue. I was sending the
    > channel.on_data too fast for the UI to process. I added in some sleep
    > statements and it worked.


    Pardon the spurious + in my previous example, I started to write it in
    the style of a patch to make it clear what I had changed, then thought
    that would actually make it more obscure!

    I'm not familiar with Net::ssh, but I suspect there will be a way to read
    from the remote machine as well as write to it. I'd recommend, that if
    you have echoing on (you can see what you type) that you try to read back
    what you sent. That way you will have less dependence on "magic" timing
    numbers, though you will have to be careful how you match what you get back,
    as is the case when you use Expect. If the system gets loaded and you have
    to wait for the echo, then that's still OK.
    >
    > Thanks a ton! :)
    > --
    > Posted via http://www.ruby-forum.com/.
    >


    Hugh
    Hugh Sasse, Nov 4, 2008
    #6
  7. Thanks Hugh,

    I'm not sure how to do an echo command with Ruby SSH while in a console
    application. The first thing I should see is a text based menu.

    I am unable to get anything from stdout it seems. When I do the same
    SSH manually from outside of Ruby, I do get the menu to come up.
    Additionally when I just do a straight session.exec command to connect
    to the server and send something, what I send doesn't matter, I can see
    the menu. This means to me that something is being sent back through
    stdout, but I can't get it with the code below.

    So this piece of code never seems to send me back anything.

    Code:
    
    channel.on_data do |ch, data|
    puts "got data: #{data.inspect}"
    end
    
    
    Thanks Again,

    Nathan

    Hugh Sasse wrote:
    > On Wed, 5 Nov 2008, Nathan Halterman wrote:
    >
    >> OOOOOkaaaaay. :)
    >>
    >> So it turns out that it was a timing issue. I was sending the
    >> channel.on_data too fast for the UI to process. I added in some sleep
    >> statements and it worked.

    >
    > Pardon the spurious + in my previous example, I started to write it in
    > the style of a patch to make it clear what I had changed, then thought
    > that would actually make it more obscure!
    >
    > I'm not familiar with Net::ssh, but I suspect there will be a way to
    > read
    > from the remote machine as well as write to it. I'd recommend, that if
    > you have echoing on (you can see what you type) that you try to read
    > back
    > what you sent. That way you will have less dependence on "magic" timing
    > numbers, though you will have to be careful how you match what you get
    > back,
    > as is the case when you use Expect. If the system gets loaded and you
    > have
    > to wait for the echo, then that's still OK.
    >>
    >> Thanks a ton! :)
    >> --
    >> Posted via http://www.ruby-forum.com/.
    >>

    >
    > Hugh


    --
    Posted via http://www.ruby-forum.com/.
    Nathan Halterman, Nov 6, 2008
    #7
  8. Okay, so I can't stand when someone finally finds the issue, but doesn't
    reply back to a forum.

    Here is my solution. The problem was that SSH 2.0 did not work for my
    connection. I had to install SSH 1.0~ and then it worked for me.

    Thanks for your help. :)
    --
    Posted via http://www.ruby-forum.com/.
    Nathan Halterman, Nov 7, 2008
    #8
  9. Last thing, the code above is 2.0 code. Here is the 1.0 code.

    Code:
    
    require 'rubygems'
    require 'net/ssh'
    
    Net::SSH.start('xx.xx.xx.xx', 'userid', "password")  do |session|
    session.open_channel do |channel|
    channel.on_success do
    puts "pty was requested successfully!"
    channel.on_success do
    puts "shell was started successfully!"
    channel.send_data "2\n" # tell the shell to exit
    sleep 3
    channel.send_data "1\n" # tell the shell to exit
    sleep 2
    channel.send_data "login"
    channel.send_data "password"
    channel.send_data "\n"
    channel.send_data "<ESC>0"
    channel.send_data "2\n"
    channel.send_data "0\n"
    end
    
    channel.send_request "shell", nil, true
    end
    
    channel.on_failure do
    puts "shell could not be started!"
    end
    
    channel.on_data do |ch,data|
    puts "recieved #{data} from shell"
    end
    
    channel.on_close do
    puts "shell terminated"
    end
    
    channel.request_pty :want_reply => true
    
    end
    
    session.loop
    
    end
    
    
    --
    Posted via http://www.ruby-forum.com/.
    Nathan Halterman, Nov 7, 2008
    #9
  10. Nathan Halterman

    Hugh Sasse Guest

    On Thu, 6 Nov 2008, Nathan Halterman wrote:

    > Thanks Hugh,
    >
    > I'm not sure how to do an echo command with Ruby SSH while in a console
    > application. The first thing I should see is a text based menu.


    I'm not talking about an echo command (as per the shell command echo). I'm
    talking about terminal settings, the sort of thing that stty handles under
    unix. If you press a key on the keyboard, does the local "terminal" echo
    it back to you (so you see it on the screen) or does the remote machine do
    that? If the remote machine does the echoing, as is normal nowadays in my
    experience, then you are best waiting for those chars you send to come back
    to you, before the response to the command.
    >
    > I am unable to get anything from stdout it seems. When I do the same
    > SSH manually from outside of Ruby, I do get the menu to come up.
    > Additionally when I just do a straight session.exec command to connect
    > to the server and send something, what I send doesn't matter, I can see
    > the menu. This means to me that something is being sent back through
    > stdout, but I can't get it with the code below.
    >
    > So this piece of code never seems to send me back anything.
    >
    >
    Code:
    >
    >         channel.on_data do |ch, data|
    >           puts "got data: #{data.inspect}"
    >         end[/color]
    
    OK, I've had a quick look at the docs to see what this is about.
    http://net-ssh.rubyforge.org/ssh/v2/api/index.html
    This is a callback, but there are lots of callbacks to register.
    I think you'll need callbacks for on_data (like you have), on_eof,
    on_request (for which you need to specify a type, but I don't know
    what they are, I can't see any mention of which class they are, or
    what they respond_to), on_open_channel, on_extended_data.
    
    The system seems to be event based, and you need to trap as many of
    those as you can get your hands on to see what is happening.
    Apart from that, you need to look about for other people's code that
    uses this, to see what "custom and practice" are, because I'm getting
    out of my depth.
    
    I'd tend to simplify this and use Expect, and maybe invoke that from
    Ruby, but I've had experience of Expect, so your feelings about
    switching to Tcl for this bit could well be different with good reasons.[color=blue]
    >
    > 
    >
    > Thanks Again,
    >
    > Nathan


    HTH
    Hugh
    >
    > Hugh Sasse wrote:
    > > On Wed, 5 Nov 2008, Nathan Halterman wrote:
    > >
    > >> OOOOOkaaaaay. :)
    > >>
    > >> So it turns out that it was a timing issue. I was sending the
    > >> channel.on_data too fast for the UI to process. I added in some sleep
    > >> statements and it worked.

    > >
    > > Pardon the spurious + in my previous example, I started to write it in
    > > the style of a patch to make it clear what I had changed, then thought
    > > that would actually make it more obscure!
    > >
    > > I'm not familiar with Net::ssh, but I suspect there will be a way to
    > > read
    > > from the remote machine as well as write to it. I'd recommend, that if
    > > you have echoing on (you can see what you type) that you try to read
    > > back
    > > what you sent. That way you will have less dependence on "magic" timing
    > > numbers, though you will have to be careful how you match what you get
    > > back,
    > > as is the case when you use Expect. If the system gets loaded and you
    > > have
    > > to wait for the echo, then that's still OK.
    > >>
    > >> Thanks a ton! :)
    > >> --
    > >> Posted via http://www.ruby-forum.com/.
    > >>

    > >
    > > Hugh

    >
    > --
    > Posted via http://www.ruby-forum.com/.
    >
    Hugh Sasse, Nov 8, 2008
    #10
    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. et

    database never closes

    et, Sep 29, 2005, in forum: ASP .Net
    Replies:
    1
    Views:
    510
    Landley
    Sep 29, 2005
  2. Soren Kuula
    Replies:
    1
    Views:
    445
    Henry S. Thompson
    Dec 1, 2005
  3. Kevin
    Replies:
    4
    Views:
    421
    Irrwahn Grausewitz
    Oct 17, 2003
  4. Replies:
    6
    Views:
    667
    Gordon Beaton
    Mar 17, 2008
  5. Replies:
    15
    Views:
    929
Loading...

Share This Page