我正在尝试编写一个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
添加到dig
和awk
之间的管道中。