【问题标题】:How to get Primary MX IP from domain in Bash如何从 Bash 中的域获取主 MX IP
【发布时间】:2013-03-04 18:08:58
【问题描述】:

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

例如:

./findmxip.sh gmail.com

会给我173.194.71.26。为此,我需要托管 gmail.com 然后在结果中找到主 MX 并托管它,获取其 IP。

【问题讨论】:

    标签: bash awk host mx-record


    【解决方案1】:

    要准确得到 0 或 1 个答案:

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

    你需要一个支持+short的非古代dig

    如前所述,可能有多个“主要”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 记录接受电子邮件的情况,这是一种不常见但完全有效的配置。

    遗憾的是,无论域是否存在 (NXDOMAIN) 以及是否存在任何 MX 记录,我测试过的所有 dig 版本都返回 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 工具和 debugging tools,它们更容易解析(但遗憾的是没有设置用户退出代码要么)。

    【讨论】:

    • +1 特别是dig -f -。这显然是脆弱的;应该处理管道中任何地方的错误,我想有裸 IP 地址的 MX 记录,尽管它应该是 CNAME。
    • @mr.spuratic 如果 MX 的 CNAME 被解析为多个 IP,则输出可以包含多个 IP。例如。 yandex.ru。可选地,可以在末尾添加“|head -n1”。
    • 这里有一个版本处理没有MX,或者只有一个MX的情况:dig +short $DOMAIN mx| sort -n | awk '{mx=$2; if(!mx) { mx=$1 }; print tolower(mx);exit} END { if (!NR) print "no_mx";exit }'(没有最后部分转换为IP地址,并添加了域名的小写转换)
    • 这里是另一个版本:dig +noall +short $(dig +noall +short gmail.com mx | sort -h) | head -n1
    • 如何在变量中得到这个?
    猜你喜欢
    • 2020-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    • 2021-08-25
    • 1970-01-01
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多