2012-01-09 7 views
4

私は現在、多くの短いSSH接続を行う必要があるRuby(Rails)アプリケーションを持っています。これはRuby Net :: SSHライブラリを使ってうまくいきますが、コマンドを作成するたびにアプリがログインしてネゴシエートする必要がありますが、遅すぎます。Ruby Net:SSH Control Master?

Ruby Net :: SSHでControl Masterを有効にする方法はありますか?コマンドラインでのテストでは、接続がすでに開いているため(キーがネゴシエートされているなど)、最初のログイン後のログインが非常に高速になります。

Net :: SSHでこれを行う方法がない場合は、誰でもそれを実行できる代替ライブラリを提案できますか?

これは一般的な要件である必要がありますので、誰かが助けてくれることを願っています。

ありがとうございます!

答えて

5

接続を開いたままにするのはなぜですか?私は、APIを知らないよう sshの呼び出しはダミーですが、それは、その目的を果たす:

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接続を取得するか、アプリケーションが乗客に配備されている場合、各プロセスが一つの接続を持つことになりますし、それを再利用します。

あなたはそれを望んでいますか?

+0

これは解決策かもしれません - 私はそれに戻ってくることができるように接続を開いたままにする方法はありますか?例えば。ユーザはSSHを必要とする何かをするために接続を開いてから、しばらく何か他のことをして(スレッドが完了するように)、別のSSHコマンドをやり直すことができます。私が理解しているように、Control Masterは基本的にこの接続を認証された状態に保ちますが、あなたのソリューションはこのような永続的なセッションを可能にしますか? –

+0

私は実際にControlMasterを使用していないので、どのように動作するのか分かりませんが、上記のようなコードを使用すると、スレッドサーバーは通常スレッドプールを持ち、すべての要求に対して新しいスレッドを作成しないため、ユーザー固有の接続が必要な場合は、上記のように直接接続を格納する代わりにハッシュを使用してください。 – Schmurfy

+0

おかげで、これは動作しているようです - あなたは(各ユーザーが唯一の独自のサーバーに接続すると、これは、間違いなく必要条件である)、ユーザー固有の接続のためのハッシュを使用して言及した - これは、ユーザーのハッシュに保存される(例えばUser.ssh_connection = Net::SSH.connect(...)) –

2

ハンドシェイクを最小限に抑えるために必要な暗号化プロトコルの種類を正確に指定することはできますが、うん、SSHはスケールアップが必要な場合は少し遅くなる可能性があります。

http://saltstack.org/これは0mqの上に独自の「ssh」の代替手段を実装しているため、複数のサーバーで並列コマンドを実行するために超高速になっています.SSH関連のパフォーマンスシェフなどの問題があるかもしれません。塩をつくることはできますか?

+0

これは興味深い解決策のように見えますが、Rubyのサポートはほとんどないようです(ほとんどがPythonのようです)。私はRailsアプリケーションのコントローラからコマンドを実行しようとしているので、Rubyで直接行うことができ、何かをきれいにすることができるようにしたいと思っています。また、明確にするために、問題は多くのサーバーを持っているわけではなく、同じサーバー上で多くのコマンドを実行しているため、なぜControl Masterを使用できるのかで問題が解決されます。 –