bash - 如何从 Bash 中的域获取主 MX IP

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

您需要一个支持+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

(相反地,对于 -t mx,您可能需要 版本的 host (bind-8.x) 测试工作,较新的版本只是返回 0。)

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

如果您真的需要用 bash 编写一个健壮的版本,请查看 djbdns CLI 工具和 debugging tools这更容易解析(尽管遗憾的是也不要设置用户退出代码)。

https://stackoverflow.com/questions/15208095/

相关文章:

sql - "column ambiguously defined"

django - 如何为多个 View 设置 cookie?

vbscript - SystemUtil.Run 在 vb 脚本中不起作用

string - 一组字符串的 R 直方图和描述性统计数据

solr - 从 DocsAndPositionsEnum 检索所有术语位置

.net - 将 OrderedDictionary 转换为 Dictionary

unix - 输出 shell 脚本到日志文件

java - 如何在其他计算机上运行java可执行文件

performance - 如何减少此 Google Apps 脚本的执行时间?

php - 通知 : unserialize() for symfony2 ( connection