在终端上运行批处理DNS记录检查



新手警报!我正试图通过bash脚本在CSV中运行DNS记录查询。我想找到host -t mx example.com的MX记录,然后用另一个CSV记录/输出结果。

由于在运行host -t mx**(space must be here)**example.com;时,无法让脚本运行host -t mx$domain命令

我所拥有的:

#!/bin/bash
while IFS=, read -r domain
do
#echo ${domain/./.}
host -t mx${domain/./.}
done < test1.csv

谢谢编辑1;添加示例输入和输出CSV输入CSV

domain
24i.co.ke,
28feb.co.ke,
4thestatewire.co.ke,
aakenya.co.ke,

预期输出

domain,mx
24i.co.ke,"24i.co.ke mail is handled by 20 alt2.aspmx.l.google.com.
24i.co.ke mail is handled by 30 aspmx3.googlemail.com.
24i.co.ke mail is handled by 10 aspmx.l.google.com."
28feb.co.ke,"28feb.co.ke mail is handled by 30 aspmx3.googlemail.com.
28feb.co.ke mail is handled by 30 aspmx5.googlemail.com.
28feb.co.ke mail is handled by 30 aspmx2.googlemail.com.
28feb.co.ke mail is handled by 10 aspmx.l.google.com.
28feb.co.ke mail is handled by 20 alt1.aspmx.l.google.com.
28feb.co.ke mail is handled by 20 alt2.aspmx.l.google.com.
28feb.co.ke mail is handled by 30 aspmx4.googlemail.com."
4thestatewire.co.ke,Host 4thestatewire.co.ke not found: 3(NXDOMAIN)
aakenya.co.ke,"aakenya.co.ke mail is handled by 20 ukns1.accesskenya.com.
aakenya.co.ke mail is handled by 10 smtpin.accesskenya.com."
abacus.co.ke,

您的替换${domain/./.}可能没有达到您预期的效果(尽管结果可能是无害的)。我可以看到您已经尝试过使用echo行进行一些调试。很有意思的是知道你认为这种替代会实现什么。

您的输入文件是CSV,有两个字段,第二个字段为空。在第一个字段中,我看不到任何需要翻译或更改的内容,以使其与DNS查找兼容。

#!/usr/bin/env bash
file="${1:-test1.csv}"
if [[ ! -f "$file" ]]; then
printf 'No file: %sn' "$file" >&2
exit 1
fi
(
read -r header; printf '%sn' "$header"
while IFS=, read -r domain; do
line="$(host -t mx "$domain" | sort | head -1)"
printf '%s,"%s"n' "$domain" "$line"
done
) < "$file"

所以。。。

  • 这将输入文件作为可选参数。如果输入文件(如果未提供,则为test1.csv)不存在,则脚本退出
  • 它获取域的MX记录,对它们进行排序,然后选择第一个。通过这样做,我们放置编号最低(优先级最高)的MX
  • while循环位于括号中,因此可以从与循环相同的输入流中读取标头。请注意,括号表示子shell,因此在括号内设置的变量对括号外的脚本部分不可见
  • 最后,这实际上打印了一些输出,而您的示例脚本没有打印这些输出。:-)

试试这个oneliner:

awk -F, 'FNR>1{ print $1 }' < input.txt 
| xargs -n 1 sh -c 'v="$(host -t mx $1)"; echo "$1,"$v""' argv0

根据您的输入文件,是在第1行之后读取,并使用不带,的第一个字段(域)。输出通过管道传输到xargs,在其中执行命令并将值存储在变量中,以便以后可以将其打印为所需的格式domain,"output"

唯一挂起的就是在输出中添加第一行"domain,mx"。

最新更新