2009-09-05 4 views
4

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

Кодекс:

#!/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 '[email protected]' 

     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» не возвращает выходные Util я выйти из программы, Мне было интересно, если кто-нибудь столкнется с этой проблемой и может рассказать мне, как я могу решить эту проблему?

ответ

4

Добавление 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. 
0

Посмотрите here. Метод exec, по-видимому, дает результат в поставляемый блок.

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

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

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

+0

Нет К сожалению, нет, это не совсем работает! Я опубликовал все соответствующие коды для тех, кто хочет проверить! : P – chutsu

+0

У меня небольшая проблема в сессии ruby ​​ssh. Пожалуйста, помогите мне. https://stackoverflow.com/questions/28799593/unix-commands-work-on-server-but-not-in-ruby-ssh-session thanks. – james

0

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

Net::SSH::Multi.start do |session| 
    # Connect to remote machines 
    ### Change this!!### 
    session.use '[email protected]' 

    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 
+0

Ну, я не могу создать интерактивное приглашение без цикла while. Мне удалось получить выход без выхода из программы. Я только что добавил «session.loop» или «session.wait» после «session.exec» с циклом while. Это похоже на работу! Однако я столкнулся с другой проблемой. Допустим, я успешно подключился к нескольким серверам, и я набираю «mkdir foo», он возвращает ошибки, например, foo уже существует или foo не найден .... странно ... – chutsu

 Смежные вопросы

  • Нет связанных вопросов^_^