Cha*_*etx 1 bash awk host mx-record
我正在尝试编写一个bash脚本,它将从域名中找到它的MX记录,从中找出哪个是主要的(它们并不总是按顺序),然后找到它的IP.(当有多个主要MX时,第一个找到的就可以了)
例如:
./findmxip.sh gmail.com
Run Code Online (Sandbox Code Playgroud)
会给我的173.194.71.26.对于我这样做,我需要托管gmail.com然后在结果中找到主MX并托管它,获得它的IP.
要获得0或1个答案:
dig +short gmail.com mx | sort -n | nawk '{print $2; exit}' | dig +short -f -
Run Code Online (Sandbox Code Playgroud)
你需要一个非古老的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
Run Code Online (Sandbox Code Playgroud)
这不处理没有MX记录且A记录接受电子邮件的情况,这是一种不常见但完全有效的配置.
遗憾的是,dig我测试的所有版本都返回0,无论域是否存在(NXDOMAIN),以及是否存在任何MX记录.您可以捕获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
Run Code Online (Sandbox Code Playgroud)
(反过来,您可能需要较旧版本的host(bind-8.x)才能使-t mx测试工作,较新的版本只返回0.)
这就是人们开始紧张地回答你为什么不使用perl/ python/的问题$MFTL.
如果你真的需要在bash中编写一个健壮的版本,请查看更容易解析的djbdns CLI工具和调试工具(尽管遗憾的是也没有设置用户退出代码).
| 归档时间: |
|
| 查看次数: |
4725 次 |
| 最近记录: |