这个脚本如何随机生成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从设备读取四个字节urandom,然后将其转换为一系列每个 1 字节的无符号整数od

set这是通过命令替换 ( $(...))来传递的,并将set位置参数$1$2和设置$3$4整数。

然后对这些整数执行一些检查,循环继续,直到其中一项测试失败。循环体中的内容:是无操作,仅需要满足 shell 的语法。


另一种生成随机 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..$4为四个随机 8 位整数,可以视为 IPv4 地址的四个八位字节。

然而,脚本中的测试看起来很奇怪。请记住,只要测试为真,循环就会重复,或者当其中任何一个测试为真时循环就会结束失败。然后第一个测试将第一个八位位组与 224 进行比较,并且失败当它等于或大于它时。因此,您将获得大于或等于 的 IP 地址224.0.0.0。这些都是多播或保留地址,因此很难看出生成器有什么实际用途。

其他测试也将接受私人使用范围,但它们要小得多,224..255因此您几乎看不到任何范围。

如果目的是生成可路由地址,则测试的意义应该相反。


至于od -An -tu1手册页解释了这些开关-An防止打印地址,-tu1将输入视为一字节无符号整数:

-A, --address-radix=RADIX
文件偏移量的输出格式; RADIX 是[doxn]十进制、八进制、十六进制或无之一

-t, --format=TYPE
TYPE 由以下一项或多项规范组成:
u[SIZE] 无符号十进制、每个整数的 SIZE 字节

相关内容