@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Ruby: CIDR を IP アドレスのリストに変換する

標準添付ライブラリ ipaddr を使う。

require 'ipaddr'
IPAddr.new('192.168.0.0/24').to_range
=> #<IPAddr: IPv4:192.168.0.0/255.255.255.255>..#<IPAddr: IPv4:192.168.0.255/255.255.255.255>

IPAddr.new('192.168.0.0/24').to_range.take(5)
=>
[#<IPAddr: IPv4:192.168.0.0/255.255.255.255>,
 #<IPAddr: IPv4:192.168.0.1/255.255.255.255>,
 #<IPAddr: IPv4:192.168.0.2/255.255.255.255>,
 #<IPAddr: IPv4:192.168.0.3/255.255.255.255>,
 #<IPAddr: IPv4:192.168.0.4/255.255.255.255>]

IPAddr.new('192.168.0.0/24').to_range.to_a.take(5)
=>
[#<IPAddr: IPv4:192.168.0.0/255.255.255.255>,
 #<IPAddr: IPv4:192.168.0.1/255.255.255.255>,
 #<IPAddr: IPv4:192.168.0.2/255.255.255.255>,
 #<IPAddr: IPv4:192.168.0.3/255.255.255.255>,
 #<IPAddr: IPv4:192.168.0.4/255.255.255.255>]

IPAddr.new('192.168.0.0/24').to_range.map(&:to_s).take(5)
=> ["192.168.0.0", "192.168.0.1", "192.168.0.2", "192.168.0.3", "192.168.0.4"]

puts IPAddr.new('192.168.0.0/24').to_range.map(&:to_s).take(5)
192.168.0.0
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4
=> nil

とはいえ毎回↑をやるのも面倒なので Web アプリを作った。/24 くらいでも結構長いリストでスクロールに時間がかかるので Scroll to bottom/Scroll to top 機能をつけた。

CIDR to IP list


なお Python では標準添付ライブラリ ipaddress を使う。

>>> from ipaddress import ip_network
>>> map(str, ip_network('192.168.0.0/24'))
<map object at 0x1005e96d0>
>>> list(map(str, ip_network('192.168.0.0/24')))[:5]
['192.168.0.0', '192.168.0.1', '192.168.0.2', '192.168.0.3', '192.168.0.4']