我想從控制檯取192.168.1.10-40這樣的IP範圍,並且想向每個IP發出請求並在控制檯上打印響應。如何從控制檯獲取IP範圍並使用Ruby向範圍內的所有IP發出請求?
這是可能做到這一點使用網絡/ http和uri或一個需要別的東西?
我想從控制檯取192.168.1.10-40這樣的IP範圍,並且想向每個IP發出請求並在控制檯上打印響應。如何從控制檯獲取IP範圍並使用Ruby向範圍內的所有IP發出請求?
這是可能做到這一點使用網絡/ http和uri或一個需要別的東西?
通過使您的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
如果它像'192.168.1.1-255.255'一樣支持輸入,比如使用'part = part.split('。'); to =(from.split('。')[0 ... part.size] + part).join('。')' – 2012-02-19 12:52:58
已更新答案,以便解析'192.168.1.1-255.255'等等。 – 2012-02-19 13:09:05
上面的代碼工作,但如果它超時到一些IP地址之間它不會繼續進一步在範圍內的下一個。該怎麼做? – 2012-02-20 11:23:31
的IPADDR類包括可比,所以你可以做這樣的事情:
require 'ipaddr'
(IPAddr.new("192.168.1.10")..IPAddr.new("192.168.1.40")).each{|ip| puts ip}
這並不回答任何問題。 – 2012-02-19 12:10:47
其實,它回答「我可以採取一系列的IP,並做他們的
@yoavmatchulsky:甚至沒有。關於這一點的難點不在於如何生成IP範圍,而是如何正確解析輸入,例如「192.168.1.10-40」或「192.168.1.1-255.255」。 – 2012-02-19 12:15:04
加成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://
這究竟是在什麼地方解析輸入的?我認爲這將是它的實際困難。 – 2012-02-19 12:15:48
這不是回答這個問題嗎?我不明白你的意思。 – p0deje 2012-02-19 12:23:48
如何將類似'192.168.1.10-40'或'192.168.1.1-255.255'的內容解析爲IPAddr範圍?這是困難(而且OP似乎沒有做出任何努力來解決這個問題,所以這不是一個好問題)。 – 2012-02-19 12:28:35
你有什麼試過的?尤其是,你曾試圖將用戶輸入解析爲合理的格式? – 2012-02-19 12:18:54