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

Bash 在终端上运行批处理DNS记录检查,bash,csv,scripting,dns,Bash,Csv,Scripting,Dns,新手警报! 我正在尝试通过bash脚本在CSV中运行DNS记录查询。我想用host-tmx example.com查找MX记录,然后将结果记录/输出到另一个CSV 由于在运行host-tmx**(空格必须在这里)**example.com时,无法让脚本运行host-tmx$domain命令 我所拥有的: #!/bin/bash while IFS=, read -r domain do #echo ${domain/./\.}\ host -t mx${domain/./\.}

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

由于在运行
host-tmx**(空格必须在这里)**example.com时,无法让脚本运行
host-tmx$domain
命令

我所拥有的:

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

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,

尝试一下这一行:

awk -F, 'FNR>1{ print $1 }' < input.txt \
    | xargs -n 1 sh -c 'v="$(host -t mx $1)"; echo "$1,\"$v\""' argv0
awk-F,'FNR>1{print$1}'
根据您的输入文件,正在读取第1行之后的内容,并使用不带
的第一个字段(域)。输出通过管道传输到
xargs
,在其中执行命令并将值存储在变量中,以便以后可以将其打印到所需格式的
域,“输出”


唯一需要解决的问题是将第一行“domain,mx”添加到输出中。

尝试一下这一行:

awk -F, 'FNR>1{ print $1 }' < input.txt \
    | xargs -n 1 sh -c 'v="$(host -t mx $1)"; echo "$1,\"$v\""' argv0
awk-F,'FNR>1{print$1}'
根据您的输入文件,正在读取第1行之后的内容,并使用不带
的第一个字段(域)。输出通过管道传输到
xargs
,在其中执行命令并将值存储在变量中,以便以后可以将其打印到所需格式的
域,“输出”


唯一未决的事情是将第一行“domain,mx”添加到输出中。

您的替换,
${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"
#/usr/bin/env bash
file=“${1:-test1.csv}”
如果[!-f“$file”];然后
printf“没有文件:%s\n”“文件”>&2
出口1
fi
(
read-r头;printf'%s\n'$header
当IFS=,read-r domain;do
行=“$(主机-t mx“$域”|排序|头-1)”
printf“%s”,“%s”\n“$domain”$line”
完成
)<“$file”
所以

  • 这将输入文件作为可选参数。如果输入文件(如果未提供,则为test1.csv)不存在,则脚本退出
  • 它获取域的MX记录,对它们进行排序,然后选择第一个记录。通过这样做,我们将最低编号(最高优先级)的MX
  • while循环在括号中,因此可以从与循环相同的输入流中读取头。请注意,括号表示子shell,因此括号外的脚本部分将看不到在括号内设置的变量
  • 最后,这实际上打印了一些输出,而您的示例脚本没有打印这些输出。:-)
      您的替代,
      ${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"
      
      #/usr/bin/env bash
      file=“${1:-test1.csv}”
      如果[!-f“$file”];然后
      printf“没有文件:%s\n”“文件”>&2
      出口1
      fi
      (
      read-r头;printf'%s\n'$header
      当IFS=,read-r domain;do
      行=“$(主机-t mx“$域”|排序|头-1)”
      printf“%s”,“%s”\n“$domain”$line”
      完成
      )<“$file”
      
      所以

      • 这将输入文件作为可选参数。如果输入文件(如果未提供,则为test1.csv)不存在,则脚本退出
      • 它获取域的MX记录,对它们进行排序,然后选择第一个记录。通过这样做,我们将最低编号(最高优先级)的MX
      • while循环在括号中,因此可以从与循环相同的输入流中读取头。请注意,括号表示子shell,因此括号外的脚本部分将看不到在括号内设置的变量
      • 最后,这实际上打印了一些输出,而您的示例脚本没有打印这些输出。:-)
      如果空间必须存在(而且必须存在),为什么不在脚本中?另外,您计划如何将内容写入“另一个CSV”,以及数据应以何种格式添加到其中?如果您可以在问题中包含输入数据和预期输出的示例,这将是一个很棒的第一个问题。:-)我尝试了不同的方法来添加空间,比如
      host-tmx${domain//\.}
      ,但我总是出错<代码>主机:无效类型:域
或未找到:3(NXDOMAIN)o.kei如果空间必须存在(而且必须存在),为什么它不在脚本中?另外,您计划如何将内容写入“另一个CSV”,以及数据应以何种格式添加到其中?如果您可以在问题中包含输入数据和预期输出的示例,这将是一个很棒的第一个问题。:-)我尝试了不同的方法来添加空间,比如
host-tmx${domain//\.}
,但我总是出错<代码>主机:无效类型:域
或未找到:3(NXDOMAIN)o.keNewbie警报!!这就是我们刚才所做的;我运行了
awk-f email.awk domain.txt
其中email.awk是您刚才共享的一行,我发现语法错误
awk:email.awk:2:awk-f,'FNR>1{print$1}'
awk:email.awk:2:^表达式中的无效字符'
awk:email.awk:2:awk-f,'FNR>1{print$1}“
awk:email.awk:2:^语法错误
我错过了吗