简单的 for 循环脚本来构建 ipv6 子网

简单的 for 循环脚本来构建 ipv6 子网

我正在尝试使用 nmap 扫描 /119 IPv6 网络。 (512 个地址)。在执行此操作之前,我想生成一个文件来填充该范围内的所有 IP 地址。网络信息如下:

network 2607:f4a0:3:0:250:56ff:feac:3c00
Prefix length   119
network range   2607:f4a0:0003:0000:0250:56ff:feac:3c00-
                2607:f4a0:0003:0000:0250:56ff:feac:3dff

所以我这样设置我的脚本:

[root@ns1 ~]# for i in {1..512}; do printf "2607:f4a0:3:0:250:56ff:feac:3c00%x\n" $i >> ipv6.txt; done

我期望在文件中看到 512 个地址,这些地址都在上述范围内。然而我看到的是这样的:

2607:f4a0:3:0:250:56ff:feac:3c001
2607:f4a0:3:0:250:56ff:feac:3c002
2607:f4a0:3:0:250:56ff:feac:3c003
2607:f4a0:3:0:250:56ff:feac:3c004
2607:f4a0:3:0:250:56ff:feac:3c005
2607:f4a0:3:0:250:56ff:feac:3c006
2607:f4a0:3:0:250:56ff:feac:3c007
2607:f4a0:3:0:250:56ff:feac:3c008
2607:f4a0:3:0:250:56ff:feac:3c009
2607:f4a0:3:0:250:56ff:feac:3c00a
2607:f4a0:3:0:250:56ff:feac:3c00b
2607:f4a0:3:0:250:56ff:feac:3c00c
2607:f4a0:3:0:250:56ff:feac:3c00d
2607:f4a0:3:0:250:56ff:feac:3c00e
2607:f4a0:3:0:250:56ff:feac:3c00f
2607:f4a0:3:0:250:56ff:feac:3c0010
2607:f4a0:3:0:250:56ff:feac:3c0011
2607:f4a0:3:0:250:56ff:feac:3c0012
2607:f4a0:3:0:250:56ff:feac:3c0013
2607:f4a0:3:0:250:56ff:feac:3c0014
2607:f4a0:3:0:250:56ff:feac:3c0015
2607:f4a0:3:0:250:56ff:feac:3c0016
2607:f4a0:3:0:250:56ff:feac:3c0017
2607:f4a0:3:0:250:56ff:feac:3c0018
2607:f4a0:3:0:250:56ff:feac:3c0019
2607:f4a0:3:0:250:56ff:feac:3c001a
2607:f4a0:3:0:250:56ff:feac:3c001b
2607:f4a0:3:0:250:56ff:feac:3c001c

当我运行 nmap 时出现错误:

nmap -Pn -sT -p 22 -6 -iL ipv6.txt > ipv6up

错误:

Failed to resolve given IPv6 hostname/IP:    2607:f4a0:3:0:250:56ff:feac:3c00200.  Note that you can't use '/mask' or   '[1-4,7,100-]' style ranges for IPv6.

我怎样才能解决这个问题?

答案1

for i in {15360..15871}; do printf "2607:f4a0:3:0:250:56ff:feac:%.4x\n" $i; done

输出:

2607:f4a0:3:0:250:56ff:feac:3c00
2607:f4a0:3:0:250:56ff:feac:3c01
2607:f4a0:3:0:250:56ff:feac:3c02
2607:f4a0:3:0:250:56ff:feac:3c03
2607:f4a0:3:0:250:56ff:feac:3dfd
2607:f4a0:3:0:250:56ff:feac:3dfe
2607:f4a0:3:0:250:56ff:feac:3dff

答案2

你就快到了。该行应如下所示:

for i in {3072..3583};do printf "2607:f4a0:3:0:250:56ff:feac:3%x\n" $i >> ipv6.txt;done

说明:您似乎认为 printf 会以某种方式将您输入的数字添加到占位符之前的数字中。事情不是这样的。 printf 所做的是将所有不是占位符的内容解释为字符串,然后将您提供的输入转换为字符串(如何完成转换取决于您使用的占位符)并用该占位符替换占位符。所以printf "bla bla%x" 8成为bla bla8printf "500%x" 8成为5008

因此,您需要将最后 3 位数字替换为占位符 %x,然后为其提供与十六进制范围 c00-dff 相对应的十进制数字,即十进制的 3072-3583(不幸的是 bash 范围运算符不理解十六进制数字)。

顺便说一句,如果你想从小于 3 位的数字开始计数,你还可以为占位符指定填充。例如,对于数字 000-200,您可以使用占位符%03x0是要用于填充少于 3 位数字的字符,也是3您想要的最小数字长度。

相关内容