Ruby Net: Мастер управления SSH? - PullRequest
4 голосов
/ 09 января 2012

В настоящее время у меня есть приложение Ruby (Rails), которое должно выполнять множество коротких SSH-соединений.Это прекрасно работает с использованием библиотеки Ruby Net :: SSH, за исключением того, что приложение должно входить в систему и согласовывать ключи каждый раз, когда я хочу сделать команду, которая слишком медленная.

Есть ли способ включить управлениеМастер с Ruby Net :: SSH?При тестировании в командной строке это делает вход (после первого) очень быстрым, поскольку соединение уже открыто (ключи согласованы и т. Д.).

Если нет способа сделать это с Net:: SSH, кто-нибудь может предложить альтернативную библиотеку, которая могла бы это сделать?

Я предполагаю, что это должно быть общим требованием, так что, надеюсь, кто-то может помочь.

Спасибо!

Ответы [ 2 ]

5 голосов
/ 09 января 2012

Почему бы просто не оставить соединение открытым?Вызовы 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 на поток или, если ваше приложение развернуто с пассажиром, у каждого процесса будет одно соединениеи будет использовать его.

Это то, что вы хотите?

2 голосов
/ 09 января 2012

Вы можете точно указать, какой протокол шифрования вы хотите, чтобы минимизировать рукопожатие, но да, SSH может быть немного медленным, если вам нужно увеличить его.

По-настоящему интересный подход: http://saltstack.org/ он реализовал собственную альтернативу "ssh" поверх 0mq, что делает его сверхбыстрым для запуска параллельных команд на нескольких серверах, очевидно, не имеяте же проблемы с производительностью, связанные с ssh, как, например, с шеф-поваром и т. д.

...