linux 加速bash脚本中的dig -x

n1bvdmb6  于 2023-05-28  发布在  Linux
关注(0)|答案(2)|浏览(137)

我必须在我的大学运行一个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
wn9m85ua

wn9m85ua1#

使用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\0' "$network" "$x" "$y"
  done
done | xargs -0 -P64 bash -c 'lookupArgs "$@"' _ >hosts_a_b.txt

请注意,这并不能保证输出的顺序(并且依赖于lookupArgs函数对每个结果执行一次write()系统调用)--但是输出是可排序的,因此您应该能够重新排序。否则,可以通过切换到GNU parallel来获得有序的输出(并确保结果的原子性)--一个大型的perl脚本,而不是GNU xargs的小型、简单、功能相对较少的实现。

wb1gzix0

wb1gzix02#

相当一部分时间只是为每个地址启动dig命令。
更好的方法是在一个命令中处理合理数量的地址,然后进行后处理以生成所需的输出。(如果您不喜欢原始输出,请添加我在本答案末尾给出的sed命令。
对于a /16网络,我建议这样做:

#!/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()系统调用。
如果你有长域名导致交错,最简单的解决方法是减少-n选项,但这会使它有点慢。
另一种减轻这种情况的方法是让dig的每次调用都写入一个单独的输出文件,然后在最后将它们组合在一起。例如:

#!/bin/bash
    d="/tmp/tmpdir$$"
    mkdir "$d"
    N=192.168.
    p=0 w=64
    for (( c=0 ; c < 256 ; ++c )) do
        (( ++p <= w )) || wait -n
        dig +noall +ans +nocl +nottl "$N$c".{0..255} > "$d/$c" &
    done
    wait
    cat "$d"/*

最后,如果您对权威名称服务器具有管理访问权限,则可以配置名称服务器以允许区域传输到您选择的主机。然后,你可以在几秒钟内使用一个命令获得所有内容:

#!/bin/bash
    dig @*ns.your.domain.* +noall +ans +nocl +nottl axfr *168.192*.in-addr.arpa

上面给出的命令输出原始的dig;你可以使用如下过滤器将其转换为所需的格式:

#!/bin/bash
    *(command as above ...)* |
    sed 's/^\([0-9.]*\)\..*[[:space:]]/\1\t/
         s/\.$//
         s/^\(.*\)\.\(.*\)\.\(.*\)\.\(.*\)\t/\4.\3.\2.\1\t/
         s/\t/  resolves to  /'

相关问题