コンソール上で、ネットワークアドレスとCIDRを指定して対象範囲のIPアドレス一覧を出力したい場合、どんな方法があるかなと思いちょっと調べてみた。 大体3個くらい(PythonとかRubyでスクリプト書くって方法を入れればもっとあるけど)を思いついたので、とりあえず残しておく。

1. nmapを使う

疎通できるネットワークにいると疎通確認が行われてしまうのでちょっと問題があるが、nmapの疎通可能IPアドレスを調査する -sL オプションを利用してやることで、対象範囲のIPアドレスの一覧を取得できる。

nmap -sL 172.16.0.0/24|grep "Nmap scan report for"|awk '{print $NF}'|tr -d '()'|uniq
blacknon@BS-PUB-DEVELOP:~$ nmap -sL 172.16.0.0/28|grep "Nmap scan report for"|awk '{print $NF}'|tr -d '()'|uniq
172.16.0.0
172.16.0.1
172.16.0.2
172.16.0.3
172.16.0.4
172.16.0.5
172.16.0.6
172.16.0.7
172.16.0.8
172.16.0.9
172.16.0.10
172.16.0.11
172.16.0.12
172.16.0.13
172.16.0.14
172.16.0.15

2. Perlワンライナーで求める

ちょっと長いけど、以下のようなPerlワンライナーを記述して計算して求めるという方法もある(forのトコとかもうちょっと短く書けるとは思うけど)。 一応、gistにもコードを上げておく。

echo 192.168.100.9/28|perl -aF[./] -lne'
for($i=0;$i<4;$i++){$x.=sprintf("%08b",$F[$i])}
$y=$F[4];
$k=substr($x,0,$y);
$m=2**(32-$y);
for($j=0;$j<$m;$j++){
    $a=$k.sprintf("%0".(32-$y)."b",$j);
    for($n=0;$n<4;$n++){$b.=".".sprintf(oct("0b".substr($a,$n*8,8)))};
    $b=~s/^\.//g;
    print $b;
    $b=""}'
blacknon@BS-PUB-DEVELOP:~$ echo 192.168.100.9/28|perl -aF[./] -lne'
> for($i=0;$i<4;$i++){$x.=sprintf("%08b",$F[$i])} 
> $y=$F[4];
> $k=substr($x,0,$y);
> $m=2**(32-$y);
> for($j=0;$j<$m;$j++){ 
>     $a=$k.sprintf("%0".(32-$y)."b",$j);
>     for($n=0;$n<4;$n++){$b.=".".sprintf(oct("0b".substr($a,$n*8,8)))};
>     $b=~s/^\.//g;
>     print $b;
>     $b=""}'
192.168.100.0
192.168.100.1
192.168.100.2
192.168.100.3
192.168.100.4
192.168.100.5
192.168.100.6
192.168.100.7
192.168.100.8
192.168.100.9
192.168.100.10
192.168.100.11
192.168.100.12
192.168.100.13
192.168.100.14
192.168.100.15

3. pripsコマンドを利用する

先日記述したように、pripsコマンドを利用することで対応する。

prips 172.16.10.0/27
blacknon@BS-PUB-UBUNTU-01:~$ prips 172.16.10.0/27
172.16.10.0
172.16.10.1
172.16.10.2
172.16.10.3
172.16.10.4
172.16.10.5
172.16.10.6
172.16.10.7
172.16.10.8
172.16.10.9
172.16.10.10
172.16.10.11
172.16.10.12
172.16.10.13
172.16.10.14
172.16.10.15
172.16.10.16
172.16.10.17
172.16.10.18
172.16.10.19
172.16.10.20
172.16.10.21
172.16.10.22
172.16.10.23
172.16.10.24
172.16.10.25
172.16.10.26
172.16.10.27
172.16.10.28
172.16.10.29
172.16.10.30
172.16.10.31

まぁ、とりあえず大体の環境ならどれかは利用できるはずなので、一覧が必要な場合には役に立つかもしれない。 grep -f とプロセス置換を組み合わせてやるのもよさそうだ。