1

我正在尝试编写一个 bash 脚本,该脚本将从域名中找到它的 MX 记录,从中找出哪个是主要的(它们并不总是按顺序排列),然后找到它的 IP。(当有多个主要 MX 时,找到的第一个 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。)

这正是人们开始紧张地后退的时候,问你为什么不使用perl// python$MFTL

如果你真的需要在 bash 中编写一个健壮的版本,请查看更容易解析的djbdns CLI 工具和调试工具(虽然遗憾的是也没有设置用户退出代码)。

于 2013-03-04T18:42:31.803 回答