如何为批量查询仅返回空的或“有问题的” DNS 记录

如何为批量查询仅返回空的或“有问题的” DNS 记录

在批量输入记录时,我想通过使用 dig 进行批量查询来验证是否将每条记录放在了正确的位置。Dig 将使用以下命令输出所有肯定结果:

dig +noall +answer

或者

dig +short

正如在回答中指出的那样,情况甚至更加接近另一个问题

dig +noall +question +answer

但这仍然显示所有“正面”的输出,使您在批量输出中搜索行首连续的两个分号,以识别未返回任何内容的记录。

我正在寻找一个命令(不一定是 Dig),它只返回错误或只指示没有结果的记录,例如仅显示那些,不是正确输入记录的典型输出。

答案1

有很多方法可以做到这一点……只需一些简单的脚本。甚至您引用的问题中也有 Python 响应。

  • 使用批量文件多次调用 DIG,而不是仅调用一次。这将返回 1 行失败,2 行或更多行成功。根据通过/失败回显名称。

  • 使用您最喜欢的脚本语言的 DNS 查找方法并评估返回代码。我喜欢 powershell,为此您可以使用[System.Net.Dns]::GetHostByAddress("fully.qualified.domain.name")

  • 使用批量文件调用一次 DIG,并对输出进行正则表达式处理(正则表达式)。以下示例同样在 powershell 中。如果您是 unix 用户,那么正则表达式也在那里。我多年前使用过 SED,但现在可能有更简单的方法。

Z Z

[string]$digout = dig +noall +answer +question goodname1 goodname2 badname1 goodname3 badname2
$digout = $digout -replace ("\r\n", "")
$digout.split(";") | select-string -notmatch "\d\s+IN"

将返回:

badname1.            IN    A
badname2.            IN    A

第一行将 DIG 输出作为字符串而不是数组分配给变量。这是必要的,因为正则表达式适用于字符串而不是数组。第二行从该变量中删除 CR/LF。第 3A 部分行将变量拆分,以便每个问题及其答案出现在同一行。第 3B 部分过滤该文本,以便仅显示没有答案的问题。

答案2

这种事情在脚本语言中会容易得多。例如,在 Python 中,错误的查找将引发异常:

Python 3.5.1 (default, Mar  3 2016, 09:29:07) 
[GCC 5.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import socket
>>> socket.gethostbyname('google.com')
'216.58.216.78'
>>> socket.gethostbyname('alsdkfjowiejlskdjf.com')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
socket.gaierror: [Errno -2] Name or service not known

因此,这只是完成所有查找并仅打印出在 try-catch 中出现的结果的问题。

相关内容