도메인 이름에 대해 일부 네임서버를 테스트하려고 합니다. 이를 위해 네임서버 목록을 읽고 도메인 이름을 요청하는 스크립트를 만들었습니다.
다음과 같은 기본적인 것 :
#!/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
Dig null
에서는 아무 것도 표시하지 않습니다.
$ 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