【问题标题】:Run Batch DNS Records Check on Terminal在终端上运行批量 DNS 记录检查
【发布时间】:2017-10-07 12:42:10
【问题描述】:

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

卡在舞台上让脚本运行host -t mx$domain命令,因为在运行host -t mx**(space must be here)**example.com;

我有什么:

#!/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,

【问题讨论】:

  • 如果空间必须存在(而且它必须存在),为什么它不在您的脚本中?另外,您打算如何将内容写入“另一个 CSV”,以及应该以什么格式添加数据?如果您可以在问题中包含输入数据和预期输出的样本,这将是第一个真棒问题。 :-)
  • 我尝试了不同的方法来添加空间,例如host -t mx ${domain/./\.},但我一直收到错误; host: invalid type: domain 或未找到:3(NXDOMAIN)o.ke

标签: bash csv scripting dns


【解决方案1】:

您的替代品${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 循环位于括号中,以便可以从与循环相同的输入流中读取标头。请注意,括号表示子shell,因此设置在其中的变量对于括号外的脚本部分是不可见的。
  • 最后,这实际上打印了一些输出,而您的示例脚本没有。 :-)

【讨论】:

    【解决方案2】:

    试试这个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”添加到输出中。

    【讨论】:

    • 新手警告!!这就是刚才所做的;我跑了awk -f email.awk domain.txt,其中email.awk 是您刚刚共享的一行,我收到语法错误awk: email.awk:2: awk -F, 'FNR&gt;1{ print $1 }' &lt; domainawk: email.awk:2: ^ invalid char ''' in expressionawk: email.awk:2: awk -F, 'FNR&gt;1{ print $1 }' &lt; domainawk: email.awk:2: ^ syntax error 我错过了什么吗?
    • 先直接在命令行试试看是否没有错误,可能需要用awk -F',' ...之类的东西来转义,
    • 谢谢。所以我删除了domain.txt 中的, 并运行awk -F, 'FNR&gt;1{ print $1 }' &lt; domain.txt \ | xargs -n 1 sh -c 'v="$(host -t mx $1)"; echo "$1,\"$v\""' argv0 我收到错误awk: fatal: cannot open file ' for reading (No such file or directory)'`
    • 无需从您的文件中删除,,您了解您遇到的错误吗?您需要在您的 domains.txt 文件所在的同一目录中运行该命令
    • 是的,我愿意。无法打开 file ' 。是的,我正在与 domain.txt 相同的目录中运行终端。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2018-12-24
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-21
    相关资源
    最近更新 更多