我正在尝试针对域名测试一些名称服务器。为此,我创建了一个脚本来读取名称服务器列表并请求域名。
像这样基本的东西:
#!/bin/bash
domain=$1
[ -z $domain ] && read -p "DOMAIN NAME: " domain
namefile="./nameserver"
echo "RESULT - NAMESERVER DOMAIN IP"
for host in $(cat "$namefile"); do
IPADD=$(dig +short "$host" "$domain" A 2> /dev/null)
[[ ! -z $IPADD ]] && result="OK" || result="FAIL"
echo "$result - Nameserver: $host - Domain: $domain - IP answer: $IPADD"
done
我遇到的问题是,当Dig
失败时,它不会将错误重定向到null
. 因此,$IPADD
变量接收到错误的值。
# CORRECT nameserver
# dig +short @8.8.8.8 google.com A 2> /dev/null
142.250.218.206
# WRONG nameserver
# dig +short @8.8.8.80 google.com A 2> /dev/null
;; connection timed out; no servers could be reached
如果我使用错误的名称服务器地址对其进行测试,我仍然会收到一条错误消息,如上所示。
据我了解,重定向到 时null
,它不应显示该错误消息。
任何想法?
谢谢你。
我想我现在明白问题出在哪里了。其实……不是问题,是行为。
如果我故意输入无效选项,Dig 会给我一个语法错误。
如果我也这样做,但重定向
stderr
到null
,Dig 不会显示任何内容。因此,Dig 似乎正确地将错误重定向到
null
,而不是stdout
。现在,如果我输入了不正确或无响应的名称服务器,Dig 实际上会告诉我它没有得到答案,
connection timed out; no server could be reached
. Dig 并不认为这是一个错误。此外,它返回代码 9,表示“没有来自服务器的回复”。换句话说,无法使用提供的名称服务器访问 DNS 服务。
据我了解,“无法访问任何服务器”可能不是最佳响应。也许将术语更改
server
为service
会稍微增强该响应。@schrodingerscatcuriosity 评论现在对我来说更有意义,并且似乎是在我的脚本中处理 Dig 响应的一种可能方式。但是,由于需要实际的 IP 响应,因此不需要将所有输出重定向到 null (&> /dev/null)。
我已经添加了一个解决方法来抑制超时输出。