Ruby Net: Мастер управления SSH?

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

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

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

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

Спасибо!

2 ответа

Решение

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

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

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

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

Другие вопросы по тегам