bash - パラメータ出力ドメインMX-esを使用するスクリプト

bash - パラメータ出力ドメインMX-esを使用するスクリプト

実行時に引数として指定された1つ以上のドメインの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

これは1つのドメインに対して機能しますが(各MXの先頭に2つのスペースを除く)、複数のドメイン(パラメータ)が指定されている場合はMXを繰り返します。出力とディテールには本当に難しいです。また、2番目のforループと配列を試しました(コメント)。ご覧のとおり、私は初心者であり、ここでコメントを聞きたいです:)

マルコに本当に感謝して安否を伝えます。

ベストアンサー1

何らかの配列や変数に内容を保存する理由はありません。また、ループに$@各クエリを含めます。dig

あなたの運動に関する私の意見は次のとおりです。

#!/bin/sh

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

タブを1つずつインデントしますが、簡単に変更できます。

ループ本体は出力を呼び出し、digそれを直接渡してawkすべての出力を処理し、BEGINブロックのフィールド自体を印刷し、タブを使用してdig出力の2番目の列をインデントします。

例を実行してください:

$ ./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各出力行の先頭(ビットからスペースまで)を2つのスペースに置き換えることにしました。

#!/bin/sh

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

おすすめ記事