Ruby net-ssh-multi:在运行时将密码作为参数传递

时间:2011-05-27 16:50:04

标签: ruby parameter-passing net-ssh

我正在尝试使用net-ssh-multi在一组服务器上运行命令。对于此taks,ssh-key身份验证不是一个选项;必须将密码传递给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:in`start':来自file.rb的参数数量错误(1为2)(ArgumentError):35

我知道这是一个n00b问题,但我真的很感激一些帮助。

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

1 个答案:

答案 0 :(得分:2)

事实证明,答案远比我想象的要简单得多。仔细阅读文档,我在Class:Net :: SSH :: Multi :: Server docs:

中注意到了这一点
  

类:Net :: SSH :: Multi :: Server

     

概述:

     

封装连接   单个遥控器的信息   服务器,以及Net :: SSH   与之对应的会话   信息。你很少需要   直接实例化其中一个:   相反,你应该使用   净:: SSH ::多::会话#使用“。

因此,不需要扩展或调用超类的类。以上可以通过以下方式完成:

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