【问题标题】:Net::SSH::Multi using the session.exec, how do you get the output straight away? RubyNet::SSH::Multi 使用 session.exec,如何立即获得输出?红宝石
【发布时间】:2009-09-09 04:13:18
【问题描述】:

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

【问题讨论】:

    标签: ruby net-ssh


    【解决方案1】:

    在 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.
    

    【讨论】:

      【解决方案2】:

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

      文档中的示例:

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

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

      【讨论】:

      • 不 不幸的是,它不太奏效!我已经发布了所有相关代码供任何人测试! :P
      • 我在 ruby​​ ssh 会话中有一个小问题。请帮我。 stackoverflow.com/questions/28799593/… 谢谢。
      【解决方案3】:

      在调用 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
      

      【讨论】:

      • 好吧,我无法在没有 while 循环的情况下生成交互式提示。我设法在不退出程序的情况下获得输出。我刚刚在带有 while 循环的“session.exec”之后添加了“session.loop”或“session.wait”。这似乎有效!但是我遇到了另一个问题。假设我已经成功连接到几台服务器,然后我输入“mkdir foo”,它返回错误,例如 foo 已经存在或 foo 未找到......奇怪......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-16
      相关资源
      最近更新 更多