리디렉션 실패 및 바인딩 오류 - 발굴

리디렉션 실패 및 바인딩 오류 - 발굴

도메인 이름에 대해 일부 네임서버를 테스트하려고 합니다. 이를 위해 네임서버 목록을 읽고 도메인 이름을 요청하는 스크립트를 만들었습니다.

다음과 같은 기본적인 것 :

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

동일한 작업을 수행하고 로 리디렉션하면 stderrDig null에서는 아무 것도 표시하지 않습니다.

$ 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

관련 정보