2009-09-05 26 views
4

所以我一直試圖使用Net :: SSH :: Multi使用通過SSH登錄到多臺計算機,然後使用session.exec(「some_command」)在遠程計算機上執行shell命令。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.exec之後添加session.loop允許程序等待輸出。

如:

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

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

看一看hereexec方法似乎將其結果提供給所提供的塊。從文檔

例子:

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

免責聲明:我沒有測試這個自己。它可能工作與否。讓我們知道它何時有效!

+0

無遺憾的是沒有,它沒有很努力!我已經發布了所有相關的代碼供任何人測試! :P – chutsu 2009-09-05 22:08:51

+0

我在ruby ssh會話中遇到了一個小問題。請幫幫我。 https://stackoverflow.com/questions/28799593/unix-commands-work-on-server-but-not-in-ruby-ssh-session謝謝。 – james 2015-03-02 01:03:16

0

刪除while循環並在調用exec之後調用session.loop。類似這樣的:

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循環的交互式提示。我設法在不退出程序的情況下獲得輸出。我剛剛在while循環的「session.exec」之後添加了「session.loop」或「session.wait」。這似乎工作!但是我遇到了另一個問題。假設我已經成功連接到幾臺服務器,並輸入「mkdir foo」,它會返回錯誤,如foo已經存在或foo未找到....怪異... – chutsu 2009-09-08 11:07:44