ドメイン名に対していくつかのネームサーバーをテストしようとしています。そのために、ネームサーバーのリストを読み、ドメイン名を要求するスクリプトを作成しました。
次の基本的なもの:
#!/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
同じことをしてリダイレクトすると、stderr
Dignull
は何も表示しません。
$ 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サービスにもアクセスできません。
私が知る限り、」サーバーにアクセスできません「おそらく最善の反応ではないでしょう。言葉を変えてください。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