このスクリプトはどのようにIPアドレスをランダムに生成しますか?

このスクリプトはどのようにIPアドレスをランダムに生成しますか?

誰かが以下のコードがどのように機能するかを説明できますか? IPアドレスをランダムに生成することはわかっていますが、どのように生成されるのかわかりません。

while
  set $(dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1)
  [ $1 -lt 224 ] &&
  [ $1 -ne 10 ] &&
  { [ $1 -ne 192 ] || [ $2 -ne 168 ]; } &&
  { [ $1 -ne 172 ] || [ $2 -lt 16 ] || [ $2 -gt 31 ]; }
do :; done
ip_address=$1.$2.$3.$4

答え1

注文する

dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1

類似データの生成

     251 113 126 026

ddデバイスから4バイトの読み込みを要求しurandom、それぞれ1バイトの一連の符号なし整数に変換しますod

setこれは、位置引数$(...)とともにコマンド置換()を介して渡され、整数に設定されます。set$1$2$3$4

その後、これらの整数に対していくつかのチェックが実行され、テストの1つが失敗するまでループが続きます。ループ本文の内容には:作業がなく、シェルの構文を満たすだけです。


任意のIPアドレスを生成する別の方法(個人アドレスの範囲内ではない):

$ nmap -n -iR 10 -sL | awk '/report for/ { print $NF }'
221.37.208.42
121.3.97.158
203.225.119.103
145.139.220.88
95.153.25.126
149.73.57.221
165.178.177.39
11.187.21.175
175.211.240.124
130.89.42.47

答え2

Kusalanandaが言ったように、このdd | odセットは$1..$44つのランダムな8ビット整数であり、IPv4アドレスの4オクテットと見なすことができます。

ところで、スクリプトのテストは奇妙に見えます。テストが真である間、ループが繰り返されるか、テストのいずれかが真の場合にループが終了することに注意してください。失敗する。次に、最初のテストでは、最初のオクテットを224と比較します。失敗するそれと同じか大きい場合。したがって、IPアドレスが.以上になります224.0.0.0。これらはすべてマルチキャストまたは予約されたアドレスであるため、ジェネレータが実際にどの用途に使用されているのかを理解するのは困難です。

他のテストでも個人使用範囲は許容されますが、はるかに小さい224..255ため、範囲はほとんど表示されません。

ルーティング可能なアドレスを生成することが目的である場合、テストの意味は反対でなければなりません。


に関してはod -An -tu1マニュアルページでは、これらのスイッチについて説明します。-Anアドレスの印刷を防ぐには、-tu1入力を1バイトの符号なし整数として扱います。

-A, --address-radix=RADIX
ファイルオフセットの出力形式は、[doxn]10進数、8進数、16進数、またはなしのいずれかです。

-t, --format=TYPE
TYPE は、以下の仕様の 1 つ以上で構成されます。
u[SIZE] 符号なし10進数、整数あたりのSIZEバイト

関連情報