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

God*_*a74 1 ruby ruby-on-rails ip-address

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

192.168.1.3-192.168.1.100
Run Code Online (Sandbox Code Playgroud)

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

["192.168.1.3","192.168.1.4",.....,"192.168.1.99","192.168.1.100"]
Run Code Online (Sandbox Code Playgroud)

我希望它会像

("192.168.1.3".."192.168.1.100").step(1).to_a
Run Code Online (Sandbox Code Playgroud)

但我想不是。

max*_*max 6

使用IPADDR从红宝石STDLIB。

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
Run Code Online (Sandbox Code Playgroud)

输出是一组 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>]
Run Code Online (Sandbox Code Playgroud)

警告的话。如果您正在接受用户输入,请确保抓住可能IPAddr::InvalidAddressError发生的潜力。

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

  • @Godzilla74:这里的技巧是 Ruby 是一种面向对象的语言,而不是面向字符串的语言。通过使用丰富的、结构化的域对象而不是贫乏的、非结构化的字符串对问题进行建模,您几乎总是可以使任何任务变得更加容易。字符串不知道子网、IP 地址等,但“IPAddr”知道。 (4认同)