使用 dig 查询地址而不解析 CNAME

使用 dig 查询地址而不解析 CNAME

我仔细研究了手册页,我很确定答案是“否”,但是有没有办法阻止dig解析CNAME主机记录?

例如:

$ dig +short mail.yahoo.com A
edge.gycpi.b.yahoodns.net.
66.218.84.40
66.218.84.44
66.218.84.41
66.218.84.45
66.218.84.42
66.218.84.43

没有A该主机的记录,所以我应该得不到答案。在这方面,它似乎A与任何其他记录类型的处理方式不同。AAAA

我已经尝试过+norecurse+noadditional选项但没有成功。我可以轻松解析脚本中的响应,看看它是否有多行,其中第一行是 FQDN,但感觉我不应该这样做。

答案1

根据RFC 1034您可以请求一种CNAME记录类型,如果存在,您将得到该记录类型。

dig -t cname +short www.bbc.co.uk
www.bbc.co.uk.pri.bbc.co.uk.

但是,似乎没有办法请求(比如说)记录A但不允许通过以下方式查找CNAME

dig -t cname +short uk.www.bbc.co.uk.pri.bbc.co.uk    # No output

的确,RFC 1034 第 3.6.2 节写道,

当名称服务器未能在与域名关联的资源集中找到所需的 RR 时,它会检查该资源集是否包含CNAME具有匹配类的记录。如果是,则名称服务器将该CNAME记录包含在响应中,并在该记录的数据字段中指定的域名处重新启动查询CNAME。此规则的一个例外是与该CNAME类型匹配的查询不会重新启动。

根据 RFC 术语,因为没有“应该“在本描述中,这是一个明确的行动方案。

为了获得您正在寻找的行为,您可能需要包装dig一些自定义代码,例如:

query=www.bbc.co.uk

result=$(dig -t cname +short "$query" | xargs)
[ -z "$result" ] && result=$(dig -t a +short "$query" | xargs)

printf "Result: %s\n" "$result"

相关内容