コンソール上でネットワークアドレスとCIDRを指定して対象範囲のIPアドレスをリストアップする(nmap/perlワンライナーetc…)

コンソール上で、ネットワークアドレスと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
Sponsored Links

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とプロセス置換を組み合わせてやるのもよさそうだ。

 


Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。

*