2012-01-03 61 views
0

我有以下代码尝试连接到各种主机并移动数据。问题是如果一个连接尝试失败,那么代码就会死掉。我怎样才能让它移动到阵列中的下一个主机。如果出现故障,则接下来的环路

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 

回答

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 

主要生产

无法连接到主机1:的getaddrinfo:节点名称也不servname提供,或者不知道

也就是说,你实际上没有提供主机名。该参数不叫"Host",它被称为"host",以及大小写。 Ruby选项通常也以符号而不是字符串传递。试试这个:

tn = Net::Telnet::new(:host => "#{hostname}", 
         :timeout => false, 
         :prompt => /[$%#>] \z/n) 

现在你会得到您所期望的错误:

无法连接到主机1:连接被拒绝 - (2)连接

+0

谢谢,我认为这会采取try catch块(以ruby开头),但确定如何使用rescue语句。工作得很好! – rahrahruby 2012-01-03 18:09:45