我必须在我的大学运行一个bash脚本作为练习,以反向查找他们拥有的B类网络块的所有DNS条目。
这是我最快的一次,但要花很长时间。有没有帮助优化这段代码?
#!/bin/bash
network="a.b"
CMD=/usr/bin/dig
for i in $(seq 1 254); do
for y in $(seq 1 254); do
answer=`$CMD -x $network.$i.$y +short`;
echo $network.$i.$y ' resolves to ' $answer >> hosts_a_b.txt;
done
done
2条答案
按热度按时间wn9m85ua1#
使用GNU xargs一次运行64个进程可能看起来像:
请注意,这并不能保证输出的顺序(并且依赖于
lookupArgs
函数对每个结果执行一次write()
系统调用)--但是输出是可排序的,因此您应该能够重新排序。否则,可以通过切换到GNU parallel来获得有序的输出(并确保结果的原子性)--一个大型的perl脚本,而不是GNU xargs的小型、简单、功能相对较少的实现。wb1gzix02#
相当一部分时间只是为每个地址启动
dig
命令。更好的方法是在一个命令中处理合理数量的地址,然后进行后处理以生成所需的输出。(如果您不喜欢原始输出,请添加我在本答案末尾给出的
sed
命令。对于a /16网络,我建议这样做:
-n64
意味着每次调用dig
将输出大约3800个字节,具体取决于结果名称的长度。只要每个dig
的整个输出小于4096字节,它将被写入单个write()
系统调用。如果你有长域名导致交错,最简单的解决方法是减少
-n
选项,但这会使它有点慢。另一种减轻这种情况的方法是让
dig
的每次调用都写入一个单独的输出文件,然后在最后将它们组合在一起。例如:最后,如果您对权威名称服务器具有管理访问权限,则可以配置名称服务器以允许区域传输到您选择的主机。然后,你可以在几秒钟内使用一个命令获得所有内容:
上面给出的命令输出原始的
dig
;你可以使用如下过滤器将其转换为所需的格式: