给出了什么:
统计服务器,回复某个范围内有多少个 IP 地址符合给定规则。
使用以下模式通过 http 联系服务器:
curl http://server/p?q=(rule)+range%3A[1.0.0.0 to 1.255.255.255]
服务器产生回复:
10,250
问题是:
用于获取包含与规则相对应的 900-1000(严格)服务器的 ip 子范围列表(例如,规则是服务器的一种类型)的最小 bash 脚本代码是什么?
我最后需要得到的是全局范围 1.0.0.0 到 1.255.255.255 内的子范围列表(例如 1.0.0.0 - 1.10.200.255)(我最初将其提供给服务器)的输出,其中给定的规则介于 900-1000 件商品之间。
例如,我这样做:
./script.sh ftp 1.0.0.0 1.255.255.255
我期望收到:
1.0.0.0 1.10.200.255 967 (should be 900< <1000)
1.10.200.255 1.50.230.255 935 (should be 900< <1000)
...
1.200.255.255 1.255.255.255 951 (the last one could be any <1000)
总计应等于初始数据 10,250=967+935+...+951
换句话说:我需要将全局 IP 范围拆分为包含 900-1000 个结果的较短子范围。它似乎暗示了 ip 子范围的暴力技术,但尚不清楚如何实现这一点。
答案1
也许是类似的事情?
#!/bin/bash
MY_INPUT=${@:-$(</dev/stdin)}
printf '%s\n' $MY_INPUT \
| xargs -n2 \
| while read LOWER UPPER; do
printf '%s %s %s\n' \
"$LOWER" "$UPPER" "$(curl http://server/p?q=(rule)+range%3A[$LOWER to $UPPER])"
done \
| awk '{SUM+=$3; print $0} END {print "Total : " SUM}' \
| column -t
只需将您的范围输入其中即可。
如果您有一个文件,其中包含范围,每行都有下限和上限......
1.1.1.1 1.2.3.4
4.5.6.7 8.9.10.11
...你可以script.sh < file_with_ranges.txt
或者你可以script.sh 1.0.0.0 1.10.200.255 1.10.200.255 1.50.230.255
MY_INPUT=${@:-$(</dev/stdin)}
有点神奇,让脚本接受:来自 stdin 的值或位置参数。
xargs
将参数分成两对。
该while
循环读取值,打印它们并调用服务器,服务器以数字响应。
awk
总结服务器返回的数字,并在处理完所有行后打印总数。
column -t
创建一个表。
test
所以如果你有一个像这样的文件......
1.0.0.0 1.10.200.255
1.10.200.255 1.50.230.255
1.200.255.255 1.255.255.255
并运行script.sh < test
,你会得到如下输出:
1.0.0.0 1.10.200.255 967
1.10.200.255 1.50.230.255 935
1.200.255.255 1.255.255.255 951
Total : 2853