Net :: SSH :: Multi使用session.exec,你如何直接获得输出?红宝石

时间:2009-09-05 12:57:42

标签: ruby net-ssh

所以我一直在尝试使用Net :: SSH :: Multi使用via SSH登录多台机器,然后使用session.exec(“some_command”)在远程机器上执行shell命令。

守则:

#!/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”没有返回输出util我退出程序,我想知道是否有人遇到过这个问题可以告诉我如何解决这个问题?

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

看看hereexec方法似乎将结果提供给提供的块。

文档中的示例:

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

免责声明:我自己没有测试过。它可能工作与否。告诉我们什么时候有效!

答案 2 :(得分:0)

删除while循环并在调用exec后调用session.loop。像这样:

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