有人能解释一下下面的代码是如何工作的吗?我知道它会随机产生一个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
发布于 2018-07-13 10:33:53
命令
dd if=/dev/urandom bs=4 count=1 2>/dev/null | od -An -tu1
生成数据,如
251 113 126 026
请dd
从urandom
设备中读取四个字节,然后将其转换为一系列无符号整数,每个整数为1字节,每个整数都带有od
。
这是通过命令替换($(...)
)传递给D6
的,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
发布于 2018-07-13 11:25:56
就像克色兰达所说的,dd | od
将$1..$4
设置为四个随机的8位整数,这些整数可以被看作是IPv4地址的四个八位数。
但是,脚本中的测试看起来很奇怪。记住,只要测试为真,循环就会重复,或者当测试失败时结束。然后,第一个测试将第一个八进制与224进行比较,当它等于或大于它时失败。因此,您将获得大于或等于224.0.0.0
的IP地址。这些都是多播或预留地址,所以很难看出生成器有什么实际用途。
其他测试也将接受私有使用范围,但它们比224..255
小得多,因此您几乎看不到任何测试。
如果目的是生成可路由地址,则测试的含义应该倒转。
至于od -An -tu1
,手册页解释了开关。。-An
阻止打印地址,-tu1
将输入作为一个字节的无符号整数:
文件偏移量的
-A, --address-radix=RADIX
输出格式;基数是[doxn]
的一种,对于十进制、八进制、十六进制或非-t, --format=TYPE
类型,D11
类型由以下一个或多个规范组成:u[SIZE]
无符号十进制,每整数大小字节。
https://unix.stackexchange.com/questions/455081
复制相似问题