2

我有一个 Rails 应用程序需要通过 ssh 与几台服务器通信。我正在使用Net::SSH库,效果很好。但是,我希望能够在请求之间以某种方式缓存/存储 ssh 连接(类似于 OpenSSH 多路复用)。

所以,我不能将它们存储在像 Memcached 或 Redis 这样的键值存储中(因为 ssh 连接不可序列化)。

我不想将它们存储在会话中,因为它们旨在供所有用户使用(此外我认为它也需要可序列化)。

我设法让它与类变量初始化常量一起工作。我知道类变量不会在服务器之间复制(在生产中),而且我很确定初始化常量也不会。就像是:

初始化器:

SSH = {}

模型:

class Server
    def connection
        require 'net/ssh'
        SSH[name] ||= Net::SSH.start(ip, "root", :password => password)
    end
end

OpenSSH多路复用会很棒,但我不确定我是否可以通过 Net::SSH ruby​​ 库来做到这一点(我回到将主连接存储在某处)。

还有其他解决方案吗?或者如果不是,哪一个是最不邪恶的?

4

2 回答 2

1

也许与其尝试在必然会导致痛苦和痛苦的请求之间共享套接字,不如将其委托给某种后台处理器?您可以设置一个 ssh 隧道并使用 DRb 进行通信,就好像它只是一个本地网络守护进程,或者任何大量联网的异步作业处理守护进程一样。

http://ruby-toolbox.com/categories/queueing.html

于 2011-01-21T19:14:02.890 回答
0

要在请求之间保持 SSH 连接,您需要生成一个后台进程。后台进程可以打开管道或某种其他类型的进程间通信方法,您可以以可序列化的方式存储该句柄。

请注意,这是一个重要的练习,这就是为什么我只在高级别的细节上描述它的原因。

于 2011-01-21T18:56:13.543 回答