Как создать список IP-адресов между двумя адресами с Ruby - PullRequest
1 голос
/ 09 апреля 2020

У меня есть пользовательский ввод 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

, но я думаю, что это не так.

Ответы [ 2 ]

4 голосов
/ 09 апреля 2020

Используйте IPAddr из Ruby 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

Вывод представляет собой массив экземпляров 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
1 голос
/ 09 апреля 2020

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"]

Я использовал его для довольно крутой автоматизации в огромных таблицах маршрутизации.

...