1

ドメイン名からMXレコードを見つけ、そこからどれがプライマリであるかを判断し(常に順番通りであるとは限りません)、そのIPを見つけるbashスクリプトを作成しようとしています。(複数のプライマリ MX がある場合、最初に見つかったもので問題ありません)

例えば:

./findmxip.sh gmail.com

私にくれるだろう173.194.71.26。これを行うには、gmail.com をホストし、結果でプライマリ MX を見つけてホストし、その IP を取得する必要があります。

4

1 に答える 1

8

正確に 0 または 1 の回答を取得するには:

dig +short gmail.com mx | sort -n | nawk '{print $2; exit}' | dig +short -f -

digをサポートする非エンシェントが必要です+short

前述のように、プリファレンスは一意である必要がないため、複数の「プライマリ」MX が存在する場合があります。最も低い設定レコードのすべての IP アドレスが必要な場合は、次のようにします。

dig +short oracle.com mx | sort -n | 
  nawk -v pref=65536 '($1<=pref) {pref=$1; print $2}' | 
  dig +short -f - | uniq

これは、MX レコードがなく、A レコードが電子メールを受け入れるケースを処理しません。これは一般的ではありませんが、完全に有効な構成です。

悲しいことに、dig私がテストしたすべてのバージョンは、ドメイン (NXDOMAIN) が存在するかどうか、および MX レコードが存在するかどうかにかかわらず、0 を返します。ただし、DNS タイムアウト (rc=9) をキャッチできます。関連するhostコマンドNXDOMAIN でゼロ以外の rc を返しますが、その動作は少し一貫性がなく、スクリプトが面倒で、出力の解析が困難です。

コマンドに応じて、わずかに堅牢になる可能性のある貧乏人のエラーチェックバージョン(tripleeeのコメントに触発された)は次のとおりです。host

DOMAIN=gmail.com
if ! host -t any $DOMAIN >/dev/null 2>&1 ; then
  echo "no such domain"
elif ! host -t mx $DOMAIN >/dev/null 2>&1;  then
  echo "no MX records"
else
  dig +short $DOMAIN mx | sort -n | nawk '{print $2; exit}' | dig +short -f -
fi

(逆に、テストが機能するために古いバージョンのhost( bind-8.x)が必要な場合があります-t mx。新しいバージョンでは代わりに 0 が返されます。)

これはちょうど、なぜ/ /を使用しないのかと、人々が神経質に後ずさりし始めるところです。perlpython$MFTL

本当に堅牢なバージョンを bash で作成する必要がある場合は、 djbdns CLI ツールとデバッグ ツールを調べてください。これらのツールの方が解析が簡単です (残念ながら、ユーザー終了コードも設定しないでください)。

于 2013-03-04T18:42:31.803 に答える