【发布时间】:2012-02-19 11:54:47
【问题描述】:
我想从控制台获取像 192.168.1.10-40 这样的 IP 范围,并希望向每个 IP 发出请求并在控制台上打印响应。
是否可以使用 net/http 和 uri 来做到这一点,还是需要其他东西?
【问题讨论】:
-
你试过什么?特别是,您尝试将用户输入解析为合理的格式吗?
我想从控制台获取像 192.168.1.10-40 这样的 IP 范围,并希望向每个 IP 发出请求并在控制台上打印响应。
是否可以使用 net/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('.')
192.168.1.1-255.255 等。
IPAddr 类包含 Comparable,因此您可以执行以下操作:
require 'ipaddr'
(IPAddr.new("192.168.1.10")..IPAddr.new("192.168.1.40")).each{|ip| puts ip}
【讨论】:
192.168.1.10-40 或192.168.1.1-255.255 等输入。
puts "StartIP:\n\n" startip = gets() puts "EndIP:\n\n" endip = gets() (IPAddr.new("#{startip}")..IPAddr.new("#{endip}")).each do |address| range = Net::HTTP.get(URI.parse(address.to_s)) range.initialize_http_header("Origin" => "#{originip}") range.set_debug_output($stdout) response = http.range range end
添加到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://
【讨论】:
192.168.1.10-40 或192.168.1.1-255.255 之类的内容解析为IPAddr 范围?这就是困难(而且 OP 自己似乎没有做出任何努力来解决这个问题,所以这不是一个好问题)。