4

所以我一直在尝试使用 Net::SSH::Multi 通过 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”不返回输出工具我退出程序,我想知道是否有人遇到过这个问题并可以告诉我我该如何解决这个问题?

4

3 回答 3

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.
于 2009-09-08T20:13:18.013 回答
0

看看这里。该exec方法似乎将其结果提供给提供的块。

文档中的示例:

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

免责声明:我自己没有对此进行测试。它可能有效,也可能无效。让我们知道它何时起作用!

于 2009-09-05T18:33:30.507 回答
0

在调用 exec 之后删除 while 循环并调用 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
于 2009-09-07T15:18:03.503 回答