2017-10-07 39 views
0

新手提醒! 我想通过bash脚本在CSV中为域记录运行DNS记录查询。我想查找带有host -t mx example.com的MX记录,然后将结果记录/输出另一个CSV。在终端上运行批量DNS记录检查

在舞台万变不离其运行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, 
+0

如果空格必须存在(而且必须),为什么它不在脚本中?另外,您打算如何将内容写入“另一个CSV”,以及以何种格式添加数据?如果您可以在问题中包含您的输入数据样本和预期输出,这将是一个*真棒*第一个问题。 :-) – ghoti

+0

我尝试过不同的方式来添加这个空间,比如'host -t mx $ {domain /./ \。}',我不断收到错误; 'host:invalid type:domain' or not found:3(NXDOMAIN)o.ke – oslee

回答

0

您的替代品${domain/./\.}可能没有达到您的预期效果(尽管结果可能无害)。我可以看到你用echo行尝试了一些调试。知道你认为这种替代会达到什么将是很有趣的。

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

#!/usr/bin/env bash 

file="${1:-test1.csv}" 

if [[ ! -f "$file" ]]; then 
    printf 'No file: %s\n' "$file" >&2 
    exit 1 
fi 

(
    read -r header; printf '%s\n' "$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循环位于括号内,以便可以从循环中的相同输入流中读取标题。请注意,圆括号表示一个子外壳,因此它们内部设置的变量对于括号外部的脚本部分将不可见。
  • 最后,这实际上是打印一些输出,你的示例脚本没有。 :-)
+0

感谢@ ghoti,真的很优雅,我期待借鉴你的思想在我的许多脚本初学者旅程。 – oslee

0

给一个尝试这种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"

唯一悬而未决的是添加的第一行“域,MX”到输出。

+0

Newbie Alert !!所以这就是刚刚做的。我运行了'awk -f email.awk domain.txt',其中email.awk是你刚刚共享的那一行,并且我得到语法错误'awk:email.awk:2:awk -F,'FNR> 1 {print $ 1} 'domain' 'awk:email.awk:2:^ expression'中的无效字符'''' 'awk:email.awk:2:awk -F,'FNR> 1 {print $ 1}' oslee

+0

首先直接在命令行中尝试,并检查是否没有错误,可能需要用'awk -F','...'来转义''',' – nbari

+0

谢谢。所以我删除'''''''''domain.txt'并运行'awk -F,'FNR> 1 {print $ 1}' oslee