在 bash 脚本中加速 dig -x
Speed up dig -x in bash script
我必须 运行 作为我大学的练习 bash 脚本来反向查找他们拥有的 B class 网络块的所有 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[=10=]' "$network" "$x" "$y"
done
done | xargs -0 -P64 bash -c 'lookupArgs "$@"' _ >hosts_a_b.txt
请注意,这不能保证输出顺序(并且依赖于 lookupArgs
函数对每个结果执行一个 write()
系统调用)——但输出是可排序的,因此您应该能够重新排序.否则,可以通过切换到 GNU parallel 获得有序输出(并确保结果的原子性)——一个大型 perl 脚本,与 GNU xargs 的小型、简单、相对低功能的实现相比。
我必须 运行 作为我大学的练习 bash 脚本来反向查找他们拥有的 B class 网络块的所有 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[=10=]' "$network" "$x" "$y"
done
done | xargs -0 -P64 bash -c 'lookupArgs "$@"' _ >hosts_a_b.txt
请注意,这不能保证输出顺序(并且依赖于 lookupArgs
函数对每个结果执行一个 write()
系统调用)——但输出是可排序的,因此您应该能够重新排序.否则,可以通过切换到 GNU parallel 获得有序输出(并确保结果的原子性)——一个大型 perl 脚本,与 GNU xargs 的小型、简单、相对低功能的实现相比。