我想从控制台取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