与えられたもの:
統計サーバは、特定の範囲内の所与の規則に一致する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
パラメータを2つのペアに分割します。
ループ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