我必须在我的大学中作为练习作为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
使用gnu xargs一次运行64个进程可能看起来像:
#!/usr/bin/env bash
lookupArgs() {
for arg; do
# echo entire line together to ensure atomicity
echo "$arg resolves to $(dig -x "$arg" +short)"
done
}
export -f lookupArgs
network="a.b"
for (( x=1; x<=254; x++ )); do
for (( y=1; y<=254; y++ )); do
printf '%s.%s.%s ' "$network" "$x" "$y"
done
done | xargs -0 -P64 bash -c 'lookupArgs "$@"' _ >hosts_a_b.txt
请注意,这不能保证输出顺序(并且依赖于lookupArgs
功能执行一个write()
SYSCALL每个结果) - 但输出是可分类的,因此您应该能够重新订购。否则,可以通过切换到GNU并行来获得有序的输出(并确保结果的原子性) - 一个大的Perl脚本,VS GNU Xargs的小型,简单,相对较低的功能实现。
当时的一个公平片段刚刚开始每个地址的dig
命令。
最好是处理一个命令中合理数量的地址,然后后处理以产生您想要的输出。(如果您不喜欢原始输出,请添加我在此答案结束时给出的sed
命令。)
对于A/16网络,我建议这样的东西:
&#x23;/bin/bash n = 192.168。 printf%s \ n -x" $ n" {0..255}。{0..255} | XARGS -R -N64 -P64 DIG NOALL ANS NOCL NOTTL
-n64
表示dig
的每个调用将根据结果名称的长度输出约3800字节。只要每个dig
的整个输出小于4096字节,它将写为单个write()
syscall。
如果您的域名长域名导致交错,最简单的修复是减少-n
选项,但这会使它变慢。
缓解这种情况的另一种方法是将dig
的每个调用写入单独的输出文件,然后在末尾组合。例如:
&#x23;/bin/bash d ="/tmp/tmpdir $$" mkdir" $ d" n = 192.168。 p = 0 w = 64 for((C = 0; C&LT; 256; c)do (( p&lt; = w))||等待-n dig noall ans nocl nottl" $ n $ c"。{0..255}&gt;" $ d/$ c"&amp; 完毕 等待 猫" $ d"/*
最后,如果您可以管理权威名称服务器,则可以配置名称服务器以允许区域传输到您选择的主机。然后,您可以使用一个命令在几秒钟内获得所有内容:
&#x23;/bin/bash dig @ns.your.domain。 noall ans nocl nottl axfr 168.192 .in-addr.arpa
我上面给出的命令输出了RAW dig
格式;您可以使用这样的过滤器将其转换为请求的格式:
&#x23;/bin/bash (上述命令...) | sed's/^([0-9。]*) ..*[:space:]]/ 1 t/ s/ $/// s/^(。*)。(。*)。(。*)。(。 s/ t/解决到/'