런타임 시 인수로 제공된 하나 이상의 도메인에 대한 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