Skip to content

Instantly share code, notes, and snippets.

Revisions

  1. goeko created this gist Mar 6, 2025.
    130 changes: 130 additions & 0 deletions digx - Check DNS Records Tool for bash or zsh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,130 @@
    # Zsh oder Bash: source ~/.digx

    function digx() {

    ################################################
    # 1) Hilfefunktion
    ################################################
    show_help() {
    echo "digx - DNS-Abfrage (kompakte Ausgabe, kein Debug)"
    echo
    echo "Verwendung:"
    echo " digx <DOMAIN> [RECORDTYPE ...]"
    echo
    echo "Beschreibung:"
    echo " Ruft für die angegebene Domain alle (oder ausgewählte) DNS-Record-Typen ab."
    echo " - Nutzt 'dig +short' für eine kompakte Ausgabe."
    echo " - Fällt zurück auf gefiltertes nslookup, falls dig kein Ergebnis liefert."
    echo " - Zeigt 'NO RECORD FOUND FOR TYPE <TYP>' bei keinem Eintrag."
    echo " - Gibt exakt das aus, was auch in die Datei geschrieben wird."
    echo
    echo "Optionen:"
    echo " -h, --help Zeigt diese Hilfe."
    echo
    echo "Beispiele:"
    echo " digx example.com (alle Standard-Typen)"
    echo " digx example.com A MX (nur A und MX)"
    echo " digx example.com NS CNAME"
    echo " digx --help"
    }

    ################################################
    # 2) Parameter prüfen (Hilfe?)
    ################################################
    if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    show_help
    return 0
    fi

    ################################################
    # 3) Domain und Record-Typen ermitteln
    ################################################
    local domain="$1"
    shift

    # Standard-Record-Typen (falls keine angegeben sind)
    local DEFAULT_RECORD_TYPES=(
    "A" "AAAA" "CNAME" "MX" "NS" "SOA" "TXT" "SRV"
    "PTR" "CAA" "DS" "DNSKEY" "RRSIG" "NSEC"
    "NSEC3" "TLSA" "URI"
    )

    # Wenn keine weiteren Argumente => nutze Standardliste
    local RECORD_TYPES=()
    if [ $# -eq 0 ]; then
    RECORD_TYPES=("${DEFAULT_RECORD_TYPES[@]}")
    else
    RECORD_TYPES=("$@")
    fi

    ################################################
    # 4) Ausgabe in einer Variablen sammeln
    ################################################
    local FULL_OUTPUT=""
    FULL_OUTPUT+="==> Hole DNS-Einträge für '$domain' ...\n\n"

    # Schleife über alle gewünschten Record-Typen
    for rtype in "${RECORD_TYPES[@]}"; do

    # 1) dig +short
    local result
    result="$(dig +short "$domain" "$rtype" 2>/dev/null)"

    # 2) Falls leer => Fallback: nslookup (gefiltert)
    if [ -z "$result" ]; then
    local fallback
    fallback="$(nslookup -type="$rtype" "$domain" 2>/dev/null | \
    grep -vE "Server:|Address:|Non-authoritative|Authoritative|origin =|mail addr =|serial =|refresh =|retry =|expire =|minimum|can't find|No answer|^\\*\\*|SERVFAIL|^$")"

    if [ -n "$fallback" ]; then
    result="$fallback"
    fi
    fi

    # 3) Prüfen, ob nur trivial "domain" übrigbleibt -> dann = kein Eintrag
    # (z.B. "grafix-house.de" oder "grafix-house.de.")
    if [ -n "$result" ]; then
    # Trailing Dot entfernen, falls vorhanden
    local stripped
    stripped="$(echo "$result" | sed 's/\.$//')"

    # Wie viele Zeilen?
    local lines_count
    lines_count="$(echo "$stripped" | wc -l | tr -d ' ')"

    # Wenn nur 1 Zeile und diese == domain => kein Eintrag
    if [ "$lines_count" -eq 1 ] && [ "$stripped" = "$domain" ]; then
    result=""
    fi
    fi

    # 4) In FULL_OUTPUT schreiben
    FULL_OUTPUT+="----- $rtype -----\n"
    if [ -z "$result" ]; then
    FULL_OUTPUT+="NO RECORD FOUND FOR TYPE $rtype\n\n"
    else
    FULL_OUTPUT+="$result\n\n"
    fi
    done

    ################################################
    # 5) Gesamtausgabe 1x auf der Konsole anzeigen
    ################################################
    printf "%b" "$FULL_OUTPUT"

    ################################################
    # 6) Fragen: soll in Datei geschrieben werden?
    ################################################
    echo -n "Soll die Ausgabe in einer Textdatei gespeichert werden? (y/n): "
    read choice
    if [ "$choice" = "y" ] || [ "$choice" = "Y" ]; then
    local timestamp
    timestamp="$(date +"%Y-%m-%d_%H-%M-%S")"
    local filename="${timestamp}_${domain}_dns.txt"
    printf "%b" "$FULL_OUTPUT" > "$filename"
    echo "Datei '$filename' wurde erstellt."
    fi
    }

    # Optionaler Alias:
    alias digx=digx