我正在尝试使用 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 bla8
并printf "500%x" 8
成为5008
因此,您需要将最后 3 位数字替换为占位符 %x,然后为其提供与十六进制范围 c00-dff 相对应的十进制数字,即十进制的 3072-3583(不幸的是 bash 范围运算符不理解十六进制数字)。
顺便说一句,如果你想从小于 3 位的数字开始计数,你还可以为占位符指定填充。例如,对于数字 000-200,您可以使用占位符%03x
。0
是要用于填充少于 3 位数字的字符,也是3
您想要的最小数字长度。