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