我有以下代码尝试连接到各种主机并移动数据。问题是如果一个连接尝试失败,那么代码就会死掉。如何让它移动到阵列中的下一个主机。
h=%w"host1 host2 host3 host4"
h.each do |hostname|
tn = Net::Telnet::new("Host" => "#{hostname}",
"Timeout" => false,
"Prompt" => /[$%#>] \z/n)
tn.cmd('String' =>'user' , 'Match'=>/Password:/) { |c| puts c }
tn.cmd('String' =>'password', 'Match'=>/#/) { |c| puts c }
tn.cmd('String' =>"show run | redirect tftp://192.1.1.1/#{hostname}-#{tdate}.cfg", 'Match'=>/#/) { |c| puts c }
sleep(3)
end
答案 0 :(得分:1)
通过处理Net::Telnet::initialize
引发的异常,您可以继续第一次失败的连接尝试。你会发现你没有得到你认为你得到的错误:
begin
tn = Net::Telnet::new("Host" => "#{hostname}",
"Timeout" => false,
"Prompt" => /[$%#>] \z/n)
rescue => e
puts "Unable to connect to #{hostname}: #{e.message}"
next
end
可生产
无法连接到host1:getaddrinfo:提供的nodename或servname,或者未知
也就是说,您实际上并未提供主机名。该参数不称为"Host"
,它被称为"host"
,并且案例很重要。 Ruby选项通常也作为符号传递,而不是 strings 。试试这个:
tn = Net::Telnet::new(:host => "#{hostname}",
:timeout => false,
:prompt => /[$%#>] \z/n)
现在你会得到你期待的错误:
无法连接到host1:连接被拒绝 - 连接(2)