如何使用 Ruby 生成两个地址之间的 IP 地址列表
How to generate a list of IP addresses between two addresses with Ruby
我让用户输入了他们想要使用的一串 IP 地址。该字符串类似于:
192.168.1.3-192.168.1.100
我正在尝试生成一个 IP 地址数组,包括起始地址和结束地址之间的 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 标准库中的 IPAddr。
IPAddr provides a set of methods to manipulate an IP address. Both
IPv4 and IPv6 are supported.
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 是一个非常强大的 gem,比 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"]
我用它在巨大的路由表中实现了一些非常酷的自动化。
我让用户输入了他们想要使用的一串 IP 地址。该字符串类似于:
192.168.1.3-192.168.1.100
我正在尝试生成一个 IP 地址数组,包括起始地址和结束地址之间的 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 标准库中的 IPAddr。
IPAddr provides a set of methods to manipulate an IP address. Both IPv4 and IPv6 are supported.
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 是一个非常强大的 gem,比 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"]
我用它在巨大的路由表中实现了一些非常酷的自动化。