リダイレクト失敗とバインディングエラー - 発掘

リダイレクト失敗とバインディングエラー - 発掘

ドメイン名に対していくつかのネームサーバーをテストしようとしています。そのために、ネームサーバーのリストを読み、ドメイン名を要求するスクリプトを作成しました。

次の基本的なもの:

#!/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

同じことをしてリダイレクトすると、stderrDignullは何も表示しません。

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

したがって、Digはエラーnullstdout

今、私が間違っているか応答していないネームサーバーを入力すると、Digは実際に応答が得られなかったことを伝えますconnection timed out; no server could be reached。 Digはこれが間違いだとは思わない。

また、「を意味するコード9を返します。サーバーから応答がありませんつまり、提供されたネームサーバーはどのDNSサービスにもアクセスできません。

私が知る限り、」サーバーにアクセスできません「おそらく最善の反応ではないでしょう。言葉を変えてください。server到着serviceこの反応はわずかに改善される。

@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

おすすめ記事