2011-05-27 68 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