错误重定向失败并绑定 - dig

错误重定向失败并绑定 - dig

我正在尝试针对域名测试一些名称服务器。为此,我创建了一个脚本来读取名称服务器列表并请求域名。

像这样的基本内容:

#!/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,它应该不是显示该错误消息。

任何想法?

谢谢。

答案1

我想我现在明白问题所在了。其实……不是问题,是行为。

如果我故意输入无效选项,Dig 会给我一个语法错误。

$ dig @8.8.8.8 google.com -A
Invalid option: -A
Usage:  dig [@global-server] [domain] [q-type] [q-class] {q-opt}
            {global-d-opt} host [@local-server] {local-d-opt}
            [ host [@local-server] {local-d-opt} [...]]

Use "dig -h" (or "dig -h | more") for complete list of options

如果我做同样的事情,但重定向stderrnull,Dig 不会向我显示任何内容。

$ dig @8.8.8.8 google.com -A 2> /dev/null

因此,Dig 似乎正确地将错误重定向到null,而不是stdout

现在,如果我输入不正确或无响应的名称服务器,Dig 实际上会告诉我它没有得到答案connection timed out; no server could be reached。 Dig 并不认为这是一个错误。

此外,它返回代码 9,这意味着“服务器无回复”。换句话说,所提供的名称服务器无法访问任何 DNS 服务。

据我了解,“无法访问服务器“可能不是最好的回应。也许改变这个词serverservice会稍微增强这种反应。

@schrodingerscatcuriosity 评论现在对我来说更有意义,并且似乎是在我的脚本中处理 Dig 响应的可能方法。但是,由于需要实际的 IP 响应,因此不需要将所有输出重定向到 null (&> /dev/null)。

我添加了一个解决方法来抑制超时输出。

for host in $(cat "$namefile"); do
    result="OK"
    IPADD=$(dig +timeout=1 +short "$host" "$domain" A 2> /dev/null)
    echo $IPADD | grep -s -q "timed out" && { IPADD="Timeout" ; result="FAIL" ; }

    echo "$result   - Nameserver: $host     - Domain: $domain       - IP answer: $IPADD"
done

相关内容