【问题标题】:How to take IP range from console and make requests to all IPs within range using Ruby?如何从控制台获取 IP 范围并使用 Ruby 向范围内的所有 IP 发出请求?
【发布时间】:2012-02-19 11:54:47
【问题描述】:

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

是否可以使用 net/http 和 uri 来做到这一点,还是需要其他东西?

【问题讨论】:

  • 你试过什么?特别是,您尝试将用户输入解析为合理的格式吗?

标签: ruby ip uri range


【解决方案1】:

通过对您的 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 等。
  • 上述代码有效,但如果超时到某个 IP 地址之间的某个 IP 地址,它将不会在范围内的下一个地址上继续进行。该怎么办?
  • 私有方法 `split' 调用 nil:NilClass (NoMethodError)
【解决方案2】:

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

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

【讨论】:

  • 这没有回答任何问题。
  • 实际上,它回答“我可以获取一定范围的 IP 并对它们执行 吗?”
  • @yoavmatchulsky:甚至没有。难点不在于如何生成 IP 范围,而在于如何正确解析192.168.1.10-40192.168.1.1-255.255 等输入。
  • 明白你的意思,但我想在我为每个 IP 发出的请求中注入标头,然后想使用 $stdout 打印所有内容。我这样写了错误: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" =&gt; "#{originip}") range.set_debug_output($stdout) response = http.range range end
【解决方案3】:

添加到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-40192.168.1.1-255.255 之类的内容解析为IPAddr 范围?这就是困难(而且 OP 自己似乎没有做出任何努力来解决这个问题,所以这不是一个好问题)。
  • 就像 steenslag 回答的那样 - 在那里更改 IP 地址,仅此而已。
  • “我想从控制台获取像 192.168.1.10-40 这样的 IP 范围”。你真的读过这个问题吗?
猜你喜欢
  • 1970-01-01
  • 2018-10-08
  • 2021-12-15
  • 2018-01-04
  • 2018-12-28
  • 2019-08-21
  • 2020-05-05
  • 2012-05-07
  • 2023-04-05
相关资源
最近更新 更多