From: "æ�Žäºšé£ž" Date: 2010-11-27T20:49:22+09:00 Subject: Re: [垃圾邮件] Net::SSH.exec Using the "exec" method interactively maybe you want to use exec! ? ÔÚ Sat, 27 Nov 2010 01:17:14 +0800£¬Guillermo Riojas дµÀ: > Hi there, > > Recently i started playing with the Net::SSH gem. So far, good, but i > just came across i question i haven't been able to respond. > > My intention is to issue several commands using the same channel in > order to be able to give continuity to my list of instructions, making > it somehow "interactive". So far, after the first command is typed and > the output returned, the rest of the instructions seem to be "not > executed". As i am pretty new to the gem and SSH in general, i realized > that somehow once the channel is closed the session too and of course, > opening a new channel puts me back in the starting point. > > So if i would like to create folder, navigate to the folder i just > created , do some other stuff there and then exit, wont work as i > expect, because every command sent starts in a new session. > > A sample of the code here: > > def exec_cmd > cont = true > > channel = @ssh.open_channel do |chn| > while cont > print "cmd> "; STDOUT.flush; str = gets.chop #User input command > cont = false if str.empty? > channel_execute chn, str.to_s > end > end #channel open loop > > channel.wait > end > > def channel_execute(chn, cmd = nil) > return nil if cmd.nil? > puts "Executing Command [#{cmd}]" > > chn.exec(cmd.to_s) do |ch,success| > raise "Could not execute command" unless success > > ch.on_data do |c, data| > out = data.split("\n") > out.each do |e| > puts "#{e}" > end > end > > ch.on_extended_data do |c, type, data| > out = data.split("\n") > out.each do |e| > puts "#{e}" > end > end > > ch.on_close { @log.debug("exec") {"Command loop finished."} } > > end #chn exec loop > > chn.wait > > end > > > Now, my first work around is sending once the list of all the commands, > in this way "mkdir testfolder; cd testfolder; mkdir testfolder2; cd /; > ..." > > However, is there any way i can keep the channel "open" in order to be > able to send each and every command separately? > > Any hint is greatly appreaciated. > > guillermo