bash - 매개변수 출력 도메인 MX-es를 사용하는 스크립트

bash - 매개변수 출력 도메인 MX-es를 사용하는 스크립트

런타임 시 인수로 제공된 하나 이상의 도메인에 대한 MX-es를 표시하는 bash 스크립트를 만들려고 합니다. 스크립트 호출 예:

./domains.sh domain1.com domain-no-mx.com domain2.net domain3.io

예상되는 출력은 각 도메인에 다음이 포함된다는 것입니다. MX-es - 각 도메인은 새 줄에 있으므로 각 MX 시작 부분에 2개의 공백을 사용하여 읽을 수 있습니다. MX가 없으면 도메인 예제 출력만 출력됩니다.

domain1.com:
  mx1.domain1.com  
  mx2.domain1.com
domain-no-mx.com:
domain2.net:
  mx1.domain2.net
  mx2.domain2.net
domain3.io:
  mx1.domain3.io

이것이 내가 지금까지 얻은 것입니다:

#!/bin/bash
# Check if at least one domain (argument) has been given
if [ $# = 0 ]; then
    echo "usage: $(basename $0) list-of-domains" 1>&2
    exit 1
fi

for domain in "$@"
do
echo "$domain:"
        MX=$(dig $@ MX +short | cut -d " " -f 2)
printf '%s\n' "  ${MX[@]}"

# for (( i=0; i<${#arr[@]}; i++));
# do
#       echo "  ${arr[i]}"
# done

done

이는 하나의 도메인에 대해 작동하지만(각 MX 시작 부분에 2개의 공백 제외) 여러 도메인(매개변수)이 제공되면 MX를 반복합니다. 출력과 디테일에 정말 어려움을 겪고 있습니다. 또한 두 번째 for 루프와 배열을 시도했습니다(주석 처리). 보시다시피 저는 초보자이고 여기서 의견을 듣고 싶습니다 :)

Marco에게 정말 감사하고 안부 전합니다.

답변1

어떤 종류의 배열이나 변수에 내용을 저장할 이유가 없습니다. 또한 루프에 $@각 쿼리를 포함시킵니다.dig

귀하의 운동에 대한 저의 의견은 다음과 같습니다.

#!/bin/sh

for domain do
        dig "$domain" mx +short |
        awk -v domain="$domain" 'BEGIN { print domain } { printf "\t%s\n", $2 }'
done

탭 한 개씩 들여쓰기되지만 쉽게 변경할 수 있습니다.

루프 본문은 출력을 호출 dig하고 이를 직접 전달 awk하여 모든 출력을 처리하고 BEGIN블록의 필드 자체를 인쇄한 다음 dig탭을 사용하여 출력의 두 번째 열을 들여쓰기합니다.

예제를 실행하세요:

$ ./script kth.se uu.se
kth.se
        mx-alt1.kth.se.
        mx.kth.se.
uu.se
        mailfilter-ng-3.sunet.se.
        mailfilter-ng-1.sunet.se.
        mailfilter-ng-2.sunet.se.

코드 대신 awk에 이미 하고 있는 것과 비슷한 작업을 수행하고 각 반복이 시작될 때 도메인을 인쇄한 다음 나머지 출력을 들여쓰기할 수 있습니다. 여기서는 dig각 출력 줄의 시작 부분(비트에서 공백까지)을 두 개의 공백으로 바꾸기 로 결정했습니다 .

#!/bin/sh

for domain do
        printf '%s\n' "$domain"
        dig "$domain" mx +short | sed 's/.* /  /'
done

관련 정보