2011-05-27 32 views
1

我试图使用net-ssh-multi在一组服务器上运行命令。对于这个taks,ssh-key认证不是一个选项;必须将密码传递给session.use行中定义的每个服务器。问题出在这里,'net/ssh'可以带密码参数,但'net/ssh/multi'不能。我想这样做是服用点是这样的:Ruby 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:在'启动':错误的参数数目(1 2)(引发ArgumentError )from file.rb:35

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

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

回答

0

原来答案是比我想象的要简单得多。净:: SSH ::多::服务器文档:

类:钻研相关文件,我在Class注意到这一点的Net :: SSH ::多::服务器

概述:

封装单个远程 服务器的连接 信息,以及与该 信息对应的Net :: SSH 会话。你很少需要 直接实例化其中的一个: 而应该使用 Net :: SSH :: Multi :: Session#use。'

所以,没有类扩展或调用超类是必要的。以上可以完成:

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 
+0

* poring(not pouring);) – 2011-05-29 23:43:44

+0

谢谢,@AbeVoelker。我希望这是关于我的代码的最尴尬的事情。 – Dmitri 2011-05-30 00:09:38

+0

对不起,并没有试图在那里变幻莫测。 Ruby还没有足够的能力评论它的有效性。但它看起来比我在前一份工作中使用的Expect/Tcl脚本清晰许多,无法使用SSH密钥(无法使用Ruby或Perl)。 :-) – 2011-05-30 00:15:07