这个简短的脚本将在几行 Bash 中打印 CIDR 范围内的所有 IP 地址。(我以同名prips
的Ubuntu 命令命名它。显然,如果该命令可用,请使用它。)
prips() {
local cidr="$1" ; local lo hi a b c d e f g h
# range is bounded by network (-n) & broadcast (-b) addresses.
lo=$(ipcalc -n "$cidr" | cut -f2 -d=)
hi=$(ipcalc -b "$cidr" | cut -f2 -d=)
IFS=. read -r a b c d <<< "$lo"
IFS=. read -r e f g h <<< "$hi"
eval "echo {$a..$e}.{$b..$f}.{$c..$g}.{$d..$h}"
}
请注意,我假设的是 RedHat Linux(Erik Troan,Preston Brown)版本ipcalc
,而不是安装在某些平台(例如 Mac OS X)上的 Krischan Jodies 版本。
例子:
$ prips 10.0.0.128/27
10.0.0.128 10.0.0.129 10.0.0.130 10.0.0.131 10.0.0.132 10.0.0.133 10.0.0.134 10.0.0.135 10.0.0.136 10.0.0.137 10.0.0.138 10.0.0.139 10.0.0.140 10.0.0.141 10.0.0.142 10.0.0.143 10.0.0.144 10.0.0.145 10.0.0.146 10.0.0.147 10.0.0.148 10.0.0.149 10.0.0.150 10.0.0.151 10.0.0.152 10.0.0.153 10.0.0.154 10.0.0.155 10.0.0.156 10.0.0.157 10.0.0.158 10.0.0.159
计算 /23 网络中正确的地址数:
$ prips 10.0.0.0/23 | wc -w
512
使用 cut 检查其中一些地址:
$ prips 10.0.0.0/23 | cut -f1-10,256-266 -d' '
10.0.0.0 10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4 10.0.0.5 10.0.0.6 10.0.0.7 10.0.0.8 10.0.0.9 10.0.0.255 10.0.1.0 10.0.1.1 10.0.1.2 10.0.1.3 10.0.1.4 10.0.1.5 10.0.1.6 10.0.1.7 10.0.1.8 10.0.1.9
也许太慢了,但也能在 /8 网络中正确生成 1600 万个地址:
$ date ; prips 10.0.0.0/8 | wc -w ; date
Sat May 20 18:06:00 AEST 2017
16777216
Sat May 20 18:06:41 AEST 2017