1

我使用Net::SSH创建了以下端口转发:

def connectToCustomerSystem
  Net::SSH.start("localhost", 'myuser', :password => "password") do |ssh|
    logger.debug ssh.exec!("hostname")
    ssh.forward.local(1234, "www.capify.org", 80) 
    #ssh.loop { true } #dont use loop to directly render director/index
  end  
  render :controller => "director", :action => "index"
end 

现在我将通过“ssh.forward.cancel_local(1234)”以新的其他方法取消此连接。

def disconnectForwarding
  ssh.forward.cancel_local(1234)
end

但是,当然,“ssh”在这种情况下是无效的。我如何搜索类型为“Net::SSH”的所有可用对象?或者有没有其他方法可以退出特定的转发(因为最终,一些不同的用户会有很多转发,我不想杀死所有人,只是一个特定的用户)。

提前致谢。

4

1 回答 1

0

我看到您在与 Rails 交互时试图保留有状态的 Ruby 对象。这不适用于 Rails 对服务器的“不共享”方法。由于块超出了您的方法的范围,因此 ssh 不仅不在范围内,而且您下次将与不同的工作进程交谈。

您需要在后台分离运行时间较长的 ruby​​ 进程来管理 ssh 连接。一个简单的方法是启动一个 ruby​​ 脚本并使用 DRb 连接到管理 ssh 的对象。然后,您可以在每次处理请求时重新连接到管理连接的 Ruby 进程,并通过 DRb 向它发出命令。在这种情况下,ssh 变量可能会作为您通过DRb 与之交谈的对象内的实例变量(看起来您可以将其设置为循环,以便它保持不变)。

有一些可怕的方法可以摆脱范围框,例如将变量设置为线程局部变量,或搜索 ObjectSpace.each_object,但这些方法在原则上非常糟糕。

于 2012-07-05T21:10:41.710 回答