On Sep 26, 2008, at 1:46 PM, Ryan Grow wrote:

> I am using net-ssh 2.0.1. I have not been able to figure out how to  
> get
> the exit value from a remotely executed process. In the only  
> examples I
> could find, only the stdout was returned, like this one:
>
>
> Net::SSH.start(host, username, :password => password) do |ssh|
>  print ssh.exec!("hostname")
> end

If you want the process exit status, you have to forgo the ssh.exec!()  
convenience method and work at a lower level.  Here's how to do it:

     ssh.open_channel do |channel|
       channel.exec(command) do |ch, success|
         unless success
           abort "FAILED: couldn't execute command (ssh.channel.exec  
failure)"
         end

         channel.on_data do |ch, data|  # stdout
           print data
         end

         channel.on_extended_data do |ch, type, data|
           next unless type == 1  # only handle stderr
           $stderr.print data
         end

         channel.on_request("exit-status") do |ch, data|
           exit_code = data.read_long
           if exit_code > 0
             puts "ERROR: exit code #{exit_code}"
           else
             puts "success"
           end
         end

         channel.on_request("exit-signal") do |ch, data|
           puts "SIGNAL: #{data.read_long}"
         end
       end
     end
     ssh.loop

  --Young