2009-09-05 25 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