Ruby net-ssh-multi: передача пароля в качестве параметра во время выполнения - PullRequest
2 голосов
/ 27 мая 2011

Я пытаюсь использовать net-ssh-multi для запуска команды на группе серверов.Для этой цели аутентификация по ssh-ключу не возможна;пароль должен быть передан каждому серверу, определенному в строках session.use.Вот проблема: «net / ssh» может принимать параметр пароля, а «net / ssh / multi» - нет.То, что я хотел бы сделать, это что-то вроде этого:

require 'net/ssh'
require 'net/ssh/multi'

#The necessary data is contained in a Ticket object 

my_ticket = Ticket.new

Net::SSH::Multi.start (:password => 'xxxx') do |session|

  # define the servers we want to use

   my_ticket.servers.each do |serv_id|
     session.use "#{my_ticket.user_name}@#{serv_id}"
   end


  # execute commands on all servers
  session.exec "uptime"


  # run the aggregated event loop
  session.loop
end

Однако, это дает мне:

file.rb: 35: в `start ': неверное количество аргументов (1 для2) (ArgumentError) из файла file.rb: 35

Я знаю, что это вопрос о n00b, но я бы очень признателен за помощь.

(http://rubydoc.info/gems/net-ssh-multi/1.1/Net/SSH/Multi)

)

1 Ответ

2 голосов
/ 30 мая 2011

Оказывается, ответ гораздо проще, чем я думал. Рассматривая документацию, я заметил это в документации класса: Net :: SSH :: Multi :: Server:

Класс: Net :: SSH :: Multi :: Server

Обзор:

Инкапсулирует соединение информация для одного пульта сервер, а также Net :: SSH сессия, соответствующая этому Информация. Вам редко нужно создать один из них напрямую: вместо этого вы должны использовать Net :: SSH :: Мульти :: Session # использование.

Итак, расширение классов или вызовы суперклассов не требуются. Выше может быть достигнуто с:

require 'net/ssh'
require 'net/ssh/multi'


#The necessary data is contained in a Ticket object 
my_ticket = Ticket.new


Net::SSH::Multi.start do |session|


  # define the servers we want to use
  my_ticket.servers.each do |session_server|
    session.use session_server , :user =>  my_ticket.user_name ,  \
    :password => my_ticket.user_pass
  end


  # execute commands on all servers
  session.exec my_ticket.command_to_do

  # run the aggregated event loop
  session.loop
end
...