我正在尝试编写一个bash脚本,它将从域名中找到它的MX记录,从中找出哪个是主要的(它们并不总是按顺序),然后找到它的IP。 (如果有超过一个主要的MX,那么第一个找到的就可以了)
例如:
./findmxip.sh gmail.com
会给我173.194.71.26
。对我来说,我需要主持gmail.com
然后在结果中找到主MX并托管它,获取其IP。
答案 0 :(得分:7)
准确地得到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
版本都返回0,无论域是否存在(NXDOMAIN),以及是否存在任何MX记录。您可以捕获DNS超时(rc = 9)。相关的host
命令确实使用NXDOMAIN返回非零rc,但是它的行为有点不一致,脚本很乱,输出难以解析。
根据您的host
命令,一个穷人的错误检查版本(受 tripleee 的评论启发)可能会稍微强一些:
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工具和debugging tools(尽管很遗憾)设置用户退出代码)。