From: Hugh Sasse Date: 2008-11-08T09:01:16+09:00 Subject: Re: Trying to Use "request_pty" Channel Never Closes 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 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. > > [/code] > > 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/. >