当没有答案时,如何让 dig +short 返回一些东西?

当没有答案时,如何让 dig +short 返回一些东西?

的行为dig +short是在运行不返回任何答案的查询时不返回任何内容(null)(与超时无关,只是一个明确的空答案)。

单独运行查询时还可以,但是当与 -f 参数结合并运行一批查询时,就很糟糕了!

dig +short -f queries.txt

queries.txt: A somedomain.com TXT otherdomain.com A somedomain.com

现在,如果 DNS 服务器没有为 TXT otherdomain.com 返回任何内容(即 ANSWER:0),没有超时或其他情况,则上述 dig 命令的输出将类似于:

dig +short -f queries.txt 1.2.3.4 1.2.3.4

即只有两行。不适用于“粘贴”和其他类似命令。您无法再合并queries.txt的输出和dig的生产输出。

这里能做任何优雅的事情吗?

答案1

在这种情况下,没有真正的方法可以实现+short您想要的功能。在处理大量数据时,它只是不合适的工具。

遇到此问题时我发现的解决方案是使用过滤器组合:+noall +question +answer+noall关闭所有显示字段,+question显示使用注释前缀进行的查询;,并+answer显示答案。

输出如下所示:

$ dig +noall +question +answer google.com serverfault.com
;google.com.                    IN      A
google.com.             284     IN      A       74.125.137.101
google.com.             284     IN      A       74.125.137.138
google.com.             284     IN      A       74.125.137.102
google.com.             284     IN      A       74.125.137.100
google.com.             284     IN      A       74.125.137.113
google.com.             284     IN      A       74.125.137.139
;serverfault.com.               IN      A
serverfault.com.        187     IN      A       198.252.206.16

如果你没有收到回复,你会看到两个相邻的问题。你不知道为什么查询失败,因为此输出不显示 RCODE(也不显示+short),但输出足以分析批量数据集和定位需要更详细分析的记录。

如果您发现自己正在对 DNS 引用进行批量分析,请切换+answer+authority

答案2

类似这样的代码非常适合粘贴,因为如果有 1 或 0 个响应(而接受的答案没有),它将为每一行输入保留一行输出。它会打印 IP 或原始 FQDN。如果需要,可以将其更改为在一行内打印所有解析的 IP,但我知道在我的情况下只有一个 IP。

for i in $(cat list); do
   ip=$(dig +short $i)
   [ -z "$ip" ] && echo $i || echo $ip
done

它将答案保存到变量中,然后检查变量是否为空(不是答案,打印输入)或者不为空(打印输出)。

答案3

我认为这个 python 脚本可以起作用。

from subprocess import Popen, PIPE

def dig(z):
    proc = Popen(
        args='dig +short {} | head -n 1'.format(z),
        shell=True, stdout=PIPE
    )
    return proc.communicate()[0]

result = dict()
with open('queries.txt') as zones:
    for zone in zones.readlines():
        zone = zone.rstrip()
        result[zone] = dig(zone)

with open('queries.txt', 'w+') as results:
    for key, value in result.items():
        if value == '':
            value = 'no answer\n'
        results.write('{} : {}'.format(key, value))

相关内容