有人可以解释一下下面的代码是如何工作的吗?我知道它会随机生成 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 字节