2012-02-19 62 views

回答

2

通过使您的IP范围的语法,我结束了以下几个假设。您可能需要考虑采用两个完整的IP地址或CIDR

require 'ipaddr' 
require 'net/http' 
require 'uri' 

range = ARGV[0] 
from, part = range.split("-") 
arr_from, arr_part = from.split("."), part.split(".") 
to = (arr_from.take(4-arr_part.length) << arr_part).join(".") 

puts "HTTP responses from #{from} to #{to}" 

ip_from = IPAddr.new(from) 
ip_to = IPAddr.new(to) 

(ip_from..ip_to).each do |ip| 
    puts ip.to_s 
    begin 
    puts Net::HTTP.get(URI.parse("http://#{ip.to_s}/")) 
    rescue => e 
    puts e.message 
    end 
end 
+0

如果它像'192.168.1.1-255.255'一样支持输入,比如使用'part = part.split('。'); to =(from.split('。')[0 ... part.size] + part).join('。')' – 2012-02-19 12:52:58

+0

已更新答案,以便解析'192.168.1.1-255.255'等等。 – 2012-02-19 13:09:05

+0

上面的代码工作,但如果它超时到一些IP地址之间它不会继续进一步在范围内的下一个。该怎么做? – 2012-02-20 11:23:31

0

的IPADDR类包括可比,所以你可以做这样的事情:

require 'ipaddr' 
(IPAddr.new("192.168.1.10")..IPAddr.new("192.168.1.40")).each{|ip| puts ip} 
+0

这并不回答任何问题。 – 2012-02-19 12:10:47

+1

其实,它回答“我可以采取一系列的IP,并做他们的?” – yoavmatchulsky 2012-02-19 12:12:42

+0

@yoavmatchulsky:甚至没有。关于这一点的难点不在于如何生成IP范围,而是如何正确解析输入,例如“192.168.1.10-40”或“192.168.1.1-255.255”。 – 2012-02-19 12:15:04

0

加成steenslag答案。

require 'net/http' 
require 'uri' 
require 'ipaddr' 

(IPAddr.new("192.168.1.10")..IPAddr.new("192.168.1.40")).each do |address| 
    puts Net::HTTP.get(URI.parse("http://#{address.to_s}")) 
end 

UPD:添加http://

+0

这究竟是在什么地方解析输入的?我认为这将是它的实际困难。 – 2012-02-19 12:15:48

+0

这不是回答这个问题吗?我不明白你的意思。 – p0deje 2012-02-19 12:23:48

+0

如何将类似'192.168.1.10-40'或'192.168.1.1-255.255'的内容解析为IPAddr范围?这是困难(而且OP似乎没有做出任何努力来解决这个问题,所以这不是一个好问题)。 – 2012-02-19 12:28:35