Как получить статус выхода с Сетью Ruby:: библиотека 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 будет interperate как false и дисплей "Отказ Выхода" (уверенный, таким образом, логика является неправильной, троичные потребности, которые будут зеркально отражены) - но вторая строка должна выйти с противоположным состоянием, и это не делает.

Я ничего не могу даже найти в документации о том, как сделать это, и я немного волнуюсь, что мог бы делать ее неправильно?!

31
задан Lee Hambley 2 August 2010 в 08:41
поделиться

1 ответ

Я нахожу следующий способ запуска процессов с помощью 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

Надеюсь, это поможет.

72
ответ дан 27 November 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: