【问题标题】:Ruby Net::SSH reuse sessionRuby Net::SSH 重用会话
【发布时间】:2019-01-09 17:59:22
【问题描述】:

我有几种方法可以做到这一点:

def method_a
    Net::SSH.start(...) do |ssh|
    end
end

def method_b
    Net::SSH.start(...) do |ssh|
    end
end
def method_c
    Net::SSH.start(...) do |ssh|
    end
end

每个方法都调用 Net::SSH start,它们是单独的 SSH 会话,做不同的事情。

有没有办法重用 Net::SSH 会话,以便所有 3 种方法都使用一个会话?

谢谢。

【问题讨论】:

    标签: ruby net-ssh


    【解决方案1】:

    是的,你绝对可以让它变干。

    您可以为 Net::SSH 连接添加一种接受主机名的方法,如下所示:

    def ssh_exec(hostname)
    
      Net::SSH.start( hostname, 'user', :timeout => 5, :paranoid => false ) do |ssh|
    
       ....
      end
    end
    

    然后你可以在任何你需要的地方用正确的主机名调用这个方法ssh_exec()...

    【讨论】:

    • 谢谢,但我重新编辑了我的问题以更清楚。您的解决方案不起作用,因为每个方法 ssh 块运行不同的东西。此外,它不是关于使代码干燥,而是关于为所有 3 个会话重用 SSH 会话
    【解决方案2】:

    在Net::SSH中走的路就是放

    @ssh_session = Net::SSH.start( @host, nil, option={:config => true})
    

    到一个变量,然后在每个方法上

    def method_a
        @ssh_session.exec!("Hello a")
    end
    
    def method_b
         @ssh_session.exec!("Hello b")
    end
    def method_c
         @ssh_session.exec!("Hello c")
    end
    

    当然,我将以上所有内容放在一个类中,这样我就可以初始化和启动 ssh 会话并执行命令,而无需重新建立 SSH。

    【讨论】:

      【解决方案3】:

      课外,你可以试试:

      
      def call
        Net::SSH.start(...) do |ssh|
          method_a(ssh)
          method_b(ssh)
          method_c(ssh)
        end
      end
      
      def method_a(ssh)
        ssh.exec(...) 
      end
      
      def method_b(ssh)
         ssh.exec(...)
      end
      
      def method_c(ssh)
         ssh.exec(...)
      end
      
      如果它在一个类中,你可以定义 `attr_reader :ssh` 然后初始化它:
      attr_reader :ssh
      
      def initialize
        @ssh ||= Net::SSH.start(...)
      end
      

      有了它,你可以简单地定义

      def method_a
        ssh.exec(...)
      end
      

      同样适用于其他方法。我希望这会有所帮助?

      【讨论】:

      • @ydanjiu,你的第二种方法,在课堂上我已经回答过了。但对于第一种方法。该调用调用了所有 3 种方法,这不是我想要实现的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多