如何获得退出状态与Ruby的Net :: SSH库?

我有一段代码,只是试图在远程服务器上执行一个脚本,如果它失败,我想进行跟进调用,想象这样:

require 'rubygems'
require 'net/ssh'
require 'etc'

server = 'localhost'

Net::SSH.start(server, Etc.getlogin) do |ssh|
  puts (ssh.exec("true")  ? 'Exit Success' : "Exit Failure")
  puts (ssh.exec("false") ? 'Exit Success' : "Exit Failure")  
end

我会期望(忽略stdout和stderr在我的设计的例子中打印) – 但第一行应该退出0,我会指望Ruby会互操作为假,并显示“退出失败”(肯定的,所以逻辑是错误的,三元需要翻转) – 但第二行应该退出与相反的状态,而不是。

我甚至不能在文档中找到任何关于如何做到这一点,我有点担心,我可能会做错了?

我发现使用Net :: SSH运行进程的更多方式更有用。它为您提供独特的stdout和stderr,退出代码和退出信号。

require 'rubygems'
require 'net/ssh'
require 'etc'

server = 'localhost'

def ssh_exec!(ssh, command)
  stdout_data = ""
  stderr_data = ""
  exit_code = nil
  exit_signal = nil
  ssh.open_channel do |channel|
    channel.exec(command) do |ch, success|
      unless success
        abort "FAILED: couldn't execute command (ssh.channel.exec)"
      end
      channel.on_data do |ch,data|
        stdout_data+=data
      end

      channel.on_extended_data do |ch,type,data|
        stderr_data+=data
      end

      channel.on_request("exit-status") do |ch,data|
        exit_code = data.read_long
      end

      channel.on_request("exit-signal") do |ch, data|
        exit_signal = data.read_long
      end
    end
  end
  ssh.loop
  [stdout_data, stderr_data, exit_code, exit_signal]
end

Net::SSH.start(server, Etc.getlogin) do |ssh|
  puts ssh_exec!(ssh, "true").inspect
  # => ["", "", 0, nil]

  puts ssh_exec!(ssh, "false").inspect  
  # => ["", "", 1, nil]

end

希望这可以帮助。

http://stackoverflow.com/questions/3386233/how-to-get-exit-status-with-rubys-netssh-library

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何获得退出状态与Ruby的Net :: SSH库?