5

我目前有一个 Ruby (Rails) 应用程序,它需要建立很多短 SSH 连接。使用 Ruby Net::SSH 库可以正常工作,只是应用程序必须在每次我想发出命令时登录并协商密钥,这太慢了。

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

如果没有办法用 Net::SSH 做到这一点,任何人都可以建议一个可以做到这一点的替代库吗?

我想这一定是一个常见的要求,所以希望有人能提供帮助。

谢谢!

4

2 回答 2

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 连接,或者如果您的应用程序与乘客一起部署,则每个进程将拥有一个连接并将重用它。

是你想要的吗?

于 2012-01-09T14:14:44.917 回答
2

你可以准确地指定你想要什么样的加密协议来最小化握手,但是如果你需要扩展它,SSH 可能会有点慢。

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

于 2012-01-09T11:25:44.587 回答