使用 bash 从 dig 打印特定元素

Printing specific elements from dig, using bash

我正在尝试编写一个 bash 脚本来从列表中的某些网站上挖掘 MX。
除了域具有的 MX 之外,我不需要所有冗余信息。

到目前为止,我的脚本是这样的:

#! /bin/bash


{ while IFS=';' read un fake
do
        dig mx $un >> tmp.txt
        awk -F ';' ' {print }' tmp.txt >> mxinfo.txt

done
} <mxlist.txt

mxlist.txt:

vg.no;
godaddy.com;
finn.no;

我从中得到的输出充满了空 space 一整行。

我希望它像这样打印:

vg.no = ASPMX.L.GOOGLE.COM
vg.no = ALT1.ASPMX.L.GOOGLE.COM
vg.no = ALT2.ASPMX.L.GOOGLE.COM
vg.no = ALT3.ASPMX.L.GOOGLE.COM
godaddy.com = godaddy-com.mail.protection.outlook.com
finn.no = alt2.aspmx.l.google.com
finn.no = aspmx.l.google.com
finn.no = alt1.aspmx.l.google.com
finn.no = alt4.aspmx.l.google.com
finn.no = alt3.aspmx.l.google.com

您还看到一些查询出现了两次或更多次。
如果没有额外的间距、冗余信息和每个域只有一个输出,我如何才能写得更好?

只使用 host 怎么样:

$ host -t mx vg.no
vg.no mail is handled by 5 ALT1.ASPMX.L.GOOGLE.COM.
vg.no mail is handled by 10 ALT4.ASPMX.L.GOOGLE.COM.
vg.no mail is handled by 1 ASPMX.L.GOOGLE.COM.
vg.no mail is handled by 10 ALT3.ASPMX.L.GOOGLE.COM.
vg.no mail is handled by 5 ALT2.ASPMX.L.GOOGLE.COM.

...但是让我们处理您的脚本。我看到的第一个问题是,对于每个域,您将 dig 输出附加到 tmp.txt,然后对其进行处理。但这意味着当它处理第二个域时,第一个域的 dig 输出仍在 tmp.txt 中(它被附加到,而不是被替换),因此它被再次处理。然后在第三次迭代中,第一个 和第二个 域仍然存在,所以它们都被再次处理,等等

解决方案:要么使用单个 >(即 > tmp.txt)直接替换内容,要么跳过临时文件并将输出直接通过管道传输到 awk(或其他任何内容)下一个)。

第二个问题是 awk 命令 awk -F ';' ' {print }' 只是打印第一个“;”之前的所有内容在每一行。它甚至在以分号开头或只是空白的行上打印;在这两种情况下,它都会打印空白行。所以你的输出中有很多空行。此外,在 do 具有相关内容的行上,它不会删除除 MX 域本身之外的所有额外数据:

vg.no.          300 IN  MX  1 ASPMX.L.GOOGLE.COM.
vg.no.          300 IN  MX  10 ALT4.ASPMX.L.GOOGLE.COM.
...

您可以修复 awk 脚本以删除空行和不相关的数据,但使用 dig +short 跳过不相关的位会更简单:

$ dig +short mx vg.no
5 ALT2.ASPMX.L.GOOGLE.COM.
1 ASPMX.L.GOOGLE.COM.
10 ALT4.ASPMX.L.GOOGLE.COM.
5 ALT1.ASPMX.L.GOOGLE.COM.
10 ALT3.ASPMX.L.GOOGLE.COM.

要在您的示例中获得表单中的输出,您只需要一个简短的 awk 程序来删除优先级字段并为要查找的域名添加前缀:

$ un=vg.no
$ dig +short mx "$un" | awk -v un="$un" '{print un " = " }'
vg.no = ASPMX.L.GOOGLE.COM.
vg.no = ALT4.ASPMX.L.GOOGLE.COM.
vg.no = ALT1.ASPMX.L.GOOGLE.COM.
vg.no = ALT3.ASPMX.L.GOOGLE.COM.
vg.no = ALT2.ASPMX.L.GOOGLE.COM.

请注意,MX 记录没有任何特定的顺序;如果您希望它们按优先级排序,请将 sort -g 添加到 digawk 之间的管道中。