我正在尝试编写一个 bash 脚本,该脚本将从域名中找到它的 MX 记录,从中找出哪个是主要的(它们并不总是按顺序排列),然后找到它的 IP。(当有多个主要 MX 时,找到的第一个 MX 就可以了)
例如:
./findmxip.sh gmail.com
会给我173.194.71.26
。为此,我需要托管 gmail.com,然后在结果中找到主 MX 并托管它,获取其 IP。
要得到 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 工具和调试工具(虽然遗憾的是也没有设置用户退出代码)。