Net::SSH::Multi с использованием session.exec, как сразу получить результат?Рубин

StackOverflow https://stackoverflow.com/questions/1383282

  •  21-09-2019
  •  | 
  •  

Вопрос

Итак, я пытался использовать Net::SSH::Multi для входа на несколько компьютеров с помощью SSH, а затем выполнял команды оболочки на удаленных машинах с помощью session.exec("some_command").

Код:

#!/usr/bin/ruby
require 'rubygems'
require 'net/ssh'
require 'net/ssh/multi'

Net::SSH::Multi.start do |session|
        # Connect to remote machines
        ### Change this!!###
        session.use 'user@server'

        loop = 1
        while loop == 1
                printf(">> ")
                command = gets.chomp
                if command == "quit" then
                        loop = 0
                else
                        session.exec(command)do |ch, stream, data|
                          puts "[#{ch[:host]} : #{stream}] #{data}"
                        end
                end
        end
end

Проблема, с которой я столкнулся на данный момент, заключается в том, что когда я ввожу команду в интерактивной подсказке, «session.exec» не возвращает выходные данные, когда я выхожу из программы, мне было интересно, сталкивался ли кто-нибудь с этой проблемой и может мне сказать как я могу решить эту проблему?

Это было полезно?

Решение

Добавление session.loop после session.exec позволяет программе ожидать вывода.

Такой как:

session.exec(command)do |ch, stream, data|
  puts "[#{ch[:host]} : #{stream}] #{data}"
end

session.loop
# Or session.wait also does the same job.

Другие советы

Взгляните здесьexec Кажется, что метод возвращает результат в предоставленный блок.

Пример из документации:

session.exec("command") do |ch, stream, data|
  puts "[#{ch[:host]} : #{stream}] #{data}"
end

Отказ от ответственности:Я не проверял это на себе.Это может сработать или нет.Дайте нам знать, когда это сработает!

Удалите цикл while и вызовите session.loop после вызова exec.Что-то вроде этого:

Net::SSH::Multi.start do |session|
  # Connect to remote machines
  ### Change this!!###
  session.use 'user@server'

  session.exec(command)do |ch, stream, data|
    puts "[#{ch[:host]} : #{stream}] #{data}"
  end

  # Tell Net::SSH to wait for output from the SSH server
  session.loop  
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top