Ruby Net:SSH控制大师?

时间:2012-01-09 11:00:01

标签: ruby-on-rails ruby ssh net-ssh

我目前有一个Ruby(Rails)应用程序需要进行大量的短SSH连接。这可以使用Ruby Net :: SSH库正常工作,除了应用程序每次我想要发出命令时都必须登录并协商密钥,这太慢了。

有没有办法用Ruby Net :: SSH启用Control Master?在命令行测试中,这使得登录(在第一个之后)非常快,因为连接已经打开(密钥已经协商等)。

如果Net :: SSH无法做到这一点,那么有人可以建议一个可以做到的替代库吗?

我认为这必须是一个共同的要求,所以希望有人可以提供帮助。

谢谢!

2 个答案:

答案 0 :(得分:5)

为什么不保持连接打开? ssh调用是虚拟的,因为我不知道api但是它起到了它的作用:

def ssh_execute(user, command)
  Thread.current[:user_connections] ||= {}

  unless Thread.current[:user_connections][user.id]
    Thread.current[:user_connections][user.id] = Net::SSH.connect(...)
  end

  ssh = Thread.current[:user_connections][user.id]
  ssh.run_command(command)
end

每个线程将获得一个ssh连接,或者如果您的应用程序与乘客一起部署,则每个进程将有一个连接并将重用它。

这是你想要的吗?

答案 1 :(得分:2)

您可以准确指定所需的加密协议类型以最小化握手,但是,如果您需要扩展它,SSH可能会有点慢。

真正有趣的是http://saltstack.org/它在0mq之上实现了它自己的“ssh”替代方案,使得在多个服务器上运行并行命令超级快,显然没有ssh的相同问题与厨师等相关的性能问题。也许你可以在盐上做这个吗?