我正在尝试使用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)
答案 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