使用bash从dig中打印特定元素



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

到目前为止,这是我的脚本看起来像:

#! /bin/bash

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

mxlist.txt:

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

我从这里得到的输出充满了空格和一整行

我想把它打印成这样:

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 $1}'只是打印第一个";"之前的所有内容。每一行。它打印,即使行,从分号开始,或仅仅是空白;在这两种情况下,它都打印空行。所以在你的输出中会有很多空行。此外,在有相关内容的那行上,它不会删除除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 " = " $2}'
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之间的管道中。

相关内容

  • 没有找到相关文章

最新更新