Net::SSH::Multi с использованием session.exec, как сразу получить результат?Рубин
Вопрос
Итак, я пытался использовать 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