我目前有一个Ruby(Rails)应用程序需要进行大量的短SSH连接。这可以使用Ruby Net :: SSH库正常工作,除了应用程序每次我想要发出命令时都必须登录并协商密钥,这太慢了。
有没有办法用Ruby Net :: SSH启用Control Master?在命令行测试中,这使得登录(在第一个之后)非常快,因为连接已经打开(密钥已经协商等)。
如果Net :: SSH无法做到这一点,那么有人可以建议一个可以做到的替代库吗?
我认为这必须是一个共同的要求,所以希望有人可以提供帮助。
谢谢!
答案 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的相同问题与厨师等相关的性能问题。也许你可以在盐上做这个吗?