【问题标题】:Speed up dig -x in bash script在 bash 脚本中加速 dig -x
【发布时间】:2019-07-28 08:51:33
【问题描述】:

我必须在我的大学运行一个 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 Parallel...
  • 无论你怎么做,进行超过 64000 次 DNS 查找都需要一段时间。

标签: linux bash loops dig


【解决方案1】:

使用 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 并行来获得有序输出(并确保结果的原子性)——一个大型 perl 脚本,而 GNU xargs 的小型、简单、功能相对较低的实现。

【讨论】:

  • 非常感谢。它明显更快。使用我的代码进行相同的扫描需要一个多小时,但您的修改只需 26 分钟
  • 这是一个非常危险的解决方案:在这种情况下它会起作用(反向名称通常比 1000 字节短得多),但你是在玩火。较长的行(>1008 字节)或多次写入会使您面临半行混合的竞争条件。不强调限制会让您看起来好像没有意识到它们:mywiki.wooledge.org/…
  • 您已经看到我在其他情况下强调了这些限制,因为这些限制可以被合理地预期受到影响——这不是我们第一次讨论这个主题。也就是说,这里可以合理地要求更多的强调,我已经进行了适当的编辑。
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2013-01-27
  • 2022-01-20
  • 2012-10-30
相关资源
最近更新 更多