2012-02-19 61 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