的行为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))