如何从控制台获取IP范围,并使用Ruby向范围内的所有IP发出请求?

如何从控制台获取IP范围,并使用Ruby向范围内的所有IP发出请求?,ruby,ip,uri,range,Ruby,Ip,Uri,Range,我想从控制台获取IP范围,如192.168.1.10-40,并希望向每个IP发出请求并在控制台上打印响应 这是否可以使用net/http和uri来实现,或者需要其他功能?IPAddr类包含Comparable,因此您可以执行以下操作: require 'ipaddr' (IPAddr.new("192.168.1.10")..IPAddr.new("192.168.1.40")).each{|ip| puts ip} 补充答案 需要“net/http” 需要“uri” 需要“ipaddr” (

我想从控制台获取IP范围,如192.168.1.10-40,并希望向每个IP发出请求并在控制台上打印响应


这是否可以使用net/http和uri来实现,或者需要其他功能?

IPAddr类包含Comparable,因此您可以执行以下操作:

require 'ipaddr'
(IPAddr.new("192.168.1.10")..IPAddr.new("192.168.1.40")).each{|ip| puts ip}
补充答案

需要“net/http”
需要“uri”
需要“ipaddr”
(IPAddress.new(“192.168.1.10”)…IPAddress.new(“192.168.1.40”)。每个do地址|
puts Net::HTTP.get(URI.parse(“HTTP://{address.to_s}”))
结束

UPD:通过对IP范围的语法进行一些假设,添加了
http://
,我最后得出以下结论。你可能想考虑两个完整的IP地址,或者代替。

需要“ipaddr”
需要“net/http”
需要“uri”
范围=ARGV[0]
起始,部分=范围。拆分(“-”)
arr_from,arr_part=from.split(“.”),part.split(“.”)
to=(arr_from.take(4-arr_part.length)e
放电子邮件
结束
结束

这并没有回答任何问题。实际上,它回答了“我可以获取一系列IP并对其执行操作吗?”@yoavmatchulsky:甚至不是。这方面的困难不在于如何生成IP范围,而是如何解析输入,如
192.168.1.10-40
192.168.1.1-255.255
。明白你的意思了,但我想在为每个IP发出的请求中插入头,然后想使用$stdout打印所有内容。我这样写的ror:
puts“StartIP:\n\n”StartIP=gets()puts“EndIP:\n\n”EndIP=gets()(IPAddr.new(“{StartIP}”)…IPAddr.new(“{EndIP}”)。每个do | address | range=Net::HTTP.get(URI.parse(address.to))range。初始化(HTTP(头(“Origin”=>“{originip}”)范围。设置调试输出($stdout)response=http.range end
这到底是在哪里解析输入的?我认为这将是它的实际困难。这不回答问题吗?我不明白你的意思。如何将类似于
192.168.1.10-40
192.168.1.1-255.255
的内容解析到IPADR范围?这就是困难所在(OP自己似乎并没有做出任何努力来解决这个问题,所以这不是一个好问题)。就像steenslag回答的那样-在那个里更改ip地址,就这样。“我想从控制台获取192.168.1.10-40这样的ip范围”。你真的读过这个问题吗?你试过什么?特别是,你试过用什么方法将用户输入解析成合理的格式?如果它支持像
192.168.1.1-255.255这样的输入,比如使用
part=part.split('.');to=(from.split('.)[0…part.size]+part.join('.'),那就更好了
更新了答案,以便它解析
192.168.1.1-255.255
等。上面的代码可以工作,但如果它超时到中间的某个IP地址,它将无法继续处理范围内的下一个IP地址。怎么办?为nil:NilClass调用了私有方法“split”(NoMethodError)
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