Trying to Use "request_pty" Channel Never Closes

  • Thread starter Nathan Halterman
  • Start date
N

Nathan Halterman

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
 
H

Hugh Sasse

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[/QUOTE]
+          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}"[QUOTE]
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[/QUOTE]
puts "session.open_channel completed, about to call loop"[QUOTE]
session.loop puts "got past loop statement"

end puts "Net ssh start completed.

end #test_rf
 
N

Nathan Halterman

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 said:
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[/QUOTE]
+          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}"[QUOTE]
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[/QUOTE]
puts "session.open_channel completed, about to call loop"[QUOTE]
session.loop puts "got past loop statement"

end[/QUOTE]
puts "Net ssh start completed.[/QUOTE]
 
N

Nathan Halterman

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! :)
 
H

Hugh Sasse

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! :)

Hugh
 
N

Nathan Halterman

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
 
N

Nathan Halterman

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

Nathan Halterman

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
 
H

Hugh Sasse

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[/QUOTE]

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.[QUOTE]

Thanks Again,

Nathan
HTH
Hugh

Hugh said:
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.

Hugh
 

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,769
Messages
2,569,580
Members
45,054
Latest member
TrimKetoBoost

Latest Threads

Top