如何使用Ruby生成两个地址之间的IP地址列表



我让用户输入一个他们想要使用的IP地址字符串。这个字符串看起来像:

192.168.1.3-192.168.1.100

我正在尝试生成一组IP地址,包括起始地址和结束地址之间的地址,看起来像:

["192.168.1.3","192.168.1.4",.....,"192.168.1.99","192.168.1.100"]

我希望它能像一样简单

("192.168.1.3".."192.168.1.100").step(1).to_a

但我想不是。

使用Ruby Stdlib中的IPAddr。

IPAddr提供了一组操作IP地址的方法。二者都支持IPv4和IPv6。

require 'ipaddr'
# I used a smaller number to limit the output
ip_range = IPAddr.new("192.168.1.3")..IPAddr.new("192.168.1.13")
ip_range.to_a

输出是IPAddr实例的数组。

=> [#<IPAddr: IPv4:192.168.1.3/255.255.255.255>, #<IPAddr: IPv4:192.168.1.4/255.255.255.255>, #<IPAddr: IPv4:192.168.1.5/255.255.255.255>, #<IPAddr: IPv4:192.168.1.6/255.255.255.255>, #<IPAddr: IPv4:192.168.1.7/255.255.255.255>, #<IPAddr: IPv4:192.168.1.8/255.255.255.255>, #<IPAddr: IPv4:192.168.1.9/255.255.255.255>, #<IPAddr: IPv4:192.168.1.10/255.255.255.255>, #<IPAddr: IPv4:192.168.1.11/255.255.255.255>, #<IPAddr: IPv4:192.168.1.12/255.255.255.255>, #<IPAddr: IPv4:192.168.1.13/255.255.255.255>]

不过还是要提醒一下。如果您正在接受用户输入,请确保捕获可能发生的潜在IPAddr::InvalidAddressError

begin 
IPAddr.new(params[:from])..IPAddr.new(params[:to])
rescue IPAddr::InvalidAddressError
# @todo handle error
logger.info("Oh Noes!")
end

IPAddress是一个非常强大的宝石,比Ruby内置的IPAddr强大得多,后者处理各种网络和子网任务,并理解IPv4和IPv6。

require 'ipaddress'
ip = IPAddress('192.168.0.1')
ip.to('192.168.0.5')
# => ["192.168.0.1",
#     "192.168.0.2",
#     "192.168.0.3",
#     "192.168.0.4",
#     "192.168.0.5"]

或者,更简洁地说:

IPAddress('192.168.0.1').to('192.168.0.5')
# => ["192.168.0.1",
#     "192.168.0.2",
#     "192.168.0.3",
#     "192.168.0.4",
#     "192.168.0.5"]

我用它在巨大的路由表中实现了一些非常酷的自动化。

相关内容

最新更新