我想修改dig
命令以自动对我在输出中收到的任何 A 记录应用反向查找。
因此,我创建了以下函数:
dt ()
{
remove=$(echo $@ | sed 's^https*^^' | sed 's^[,/*:]^^g' );
dig any +trace +nocl +nodnssec $remove | sed "s/($remove.*As*([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))/dig -x 2 +short | xargs echo "1 ->"/e"
}
使用此代码,我有以下输出(仅显示记录部分,以避免问题变大):
domain.com. 1200 A 198.54.115.174 -> server224-3.web-hosting.com.
但是,现在我还需要使用从 dig 输出接收的 IP 进行 whois 查找,但前提是dig -x 2 +short
没有给出任何结果(stackoverflow.com 可以成为具有 A 记录的域的一个很好的例子没有 PTR)。
我尝试了这样的东西来检查常规host
命令的退出代码(因为dig
意味着即使输出为空,输出也是成功的)并根据结果执行正确的命令:
dig any +trace +nocl +nodnssec "$remove" | sed -e "s/($remove.*As*([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}))/echo -n "1 -> "; host 2 | grep -q ''; if [ ${PIPESTATUS[0]} -eq 0 ]; then dig -x 2 +short; else whois 2 | grep 'network:Network-Name:';fi; /e"
但似乎 sed 以某种方式影响了${PIPESTATUS[0]}
数组的值。
我想在 sed 中进行这些修改,因为我需要一些可以在旅途中打印线条的东西。如果我使用变量并修改它们的输出,该函数的运行速度会变慢,至少在视觉上是这样。
也许awk
在这里有用,但我不确定我应该如何使用这个命令编写代码。
有没有办法解决这个问题?sed 可以用于此目的还是应该使用其他工具?谢谢。
老式的 bash 为您提供了各种工具grep
、awk
、xargs
、while read
等。将sed
与e
命令一起使用,并在内部检查管道状态并执行xargs。只是不可读,读得太长了。我不清楚你想做什么,因为一条线上发生了太多事情。
dig
命令在成功时结果为零状态 - 当它"失败"时,您可以检查它的输出是否长度为零。
请考虑以下脚本:
dt () {
remove=$(
<<<$1
sed 's#^http[s]?://([^/]*).*#1#'
)
dig any +trace +nocl +nodnssec "$remove" |
tr -s 't' |
awk -v "remove=${remove}." '{
if ($1 == remove && $3 == "A") {
print
}
}' |
while IFS= read -r line; do
IFS=$'t' read -r _ _ _ ip _ <<<"$line"
if ! dig_result=$(dig -x "$ip" +short); then
echo "Dig error" >&2
exit 1
fi
if [ -z "$dig_result" ]; then
printf "%s -> no-result-from-dign" "$line"
else
printf "%s -> %sn" "$line" "$dig_result"
fi
done
}
- 运行第一个
dig
。请注意引用了"$remove"
。 - 只是一种预防措施 - 我在输出中挤压制表器。
- 然后我过滤 - 第一列应该有一个点
"$remove".
,第三列应该是一个"A"
- 然后对于每行(因为有 meny)
- 我得到了IP地址(好吧,也许
ip=$(<<<"$line" cut -f4)
会更干净,更简单)。 - 我使用 IP 地址从
dig -x
中获取结果
如果结果为空,我打印 - "no-result-from-dig",如果不是,我打印结果。
运行:
dt stackoverflow.com
dt google.pl
输出:
stackoverflow.com. 300 A 151.101.65.69 -> no-result-from-dig
stackoverflow.com. 300 A 151.101.193.69 -> no-result-from-dig
stackoverflow.com. 300 A 151.101.129.69 -> no-result-from-dig
stackoverflow.com. 300 A 151.101.1.69 -> no-result-from-dig
google.pl. 300 A 216.58.215.67 -> waw02s16-in-f3.1e100.net.
您的命令不起作用的原因是$PIPESTATUS
在运行 shell 之前"
引号内被引用,因此展开。您应该转义$
以便$PIPESTATUS
或将其传递到非膨胀的单引号" ... "'$PIPESTATUS'" ... "
。