2

我正在尝试使用 net-ssh-multi 在一组服务器上运行命令。对于这个任务,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:35 的参数数量错误(1 对 2)(ArgumentError)

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

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

4

1 回答 1

2

事实证明,答案比我想象的要简单得多。仔细阅读文档,我在 Class: Net::SSH::Multi::Server 文档中注意到了这一点:

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

概述:

封装单个远程服务器的连接信息,以及与该信息对应的 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
于 2011-05-29T23:38:55.213 回答