dig
是一种故障排除工具,它发送DNS查询并接收DNS响应,正如安德烈亚斯所说,答案既是CNAME记录又是A记录,这是设计上的。您希望得到“只有IP地址”,因此这不是一个DNS故障排除,而是“只是”解析问题,对于这个问题,dig
太过强大。
nslookup
nslookup
比dig
差,但仍会给出太多信息:
$ nslookup docs.sbonds.org
Server: 192.0.2.254
Address: 192.0.2.254#53
Non-authoritative answer:
docs.sbonds.org canonical name = ghs.google.com.
Name: ghs.google.com
Address: 172.217.4.179
主机
主机
更简单,但仍会为您返回“太多”(但请注意它还返回IPv6地址,这是好的):
$ host docs.sbonds.org
docs.sbonds.org is an alias for ghs.google.com.
ghs.google.com has address 172.217.15.83
ghs.google.com has IPv6 address 2607:f8b0:4004:815::2013
根据您的Unix系统,可以使用getent
命令。但请注意,这可能会或可能不会执行DNS查询,因为您可以在/etc/nsswitch.conf
中配置每个服务的数据源,并且对于hosts
来说,它可能是files
(即古老的/etc/hosts
)和DNS的混合体。
$ getent hosts docs.sbonds.org
2607:f8b0:4007:801::2013 ghs.google.com docs.sbonds.org
还要注意,在正确的Unix设置上,它会优先使用IPv6而不是IPv4,这可能对您造成问题(这应该取决于/etc/gai.conf
中的配置)。
事实上,hosts
不遵守/etc/gai.conf
,您需要改用ahosts
,它将使用getaddrinfo
,因此也会使用gai.conf
。请注意,您会得到一个列表(其顺序取决于gai.conf
的配置):
$ getent ahosts docs.sbonds.org
172.217.4.179 STREAM ghs.google.com
172.217.4.179 DGRAM
172.217.4.179 RAW
2607:f8b0:4007:801::2013 STREAM
2607:f8b0:4007:801::2013 DGRAM
2607:f8b0:4007:801::2013 RAW
Perl
如果你被允许编写一个简单的脚本,你有很多解决方案,比如:
$ perl -MSocket -E 'say inet_ntoa(inet_aton("docs.sbonds.org"))'
172.217.4.179
DOH
或者使用任何 DOH(DNS over HTTPS)端点(或类似的)与任何 HTTP 客户端。示例:
$ curl --silent 'https://dns.google.com/resolve?name=docs.sbonds.org&type=A' | jq -c '.Answer[] | select(.type == 1) | .data'
"172.217.3.83"
$ curl --silent -H 'accept: application/dns-json' 'https://cloudflare-dns.com/dns-query?name=docs.sbonds.org&type=A' | jq -c '.Answer[] | select(.type == 1) | .data'
"172.217.12.147"
Systemd
Systemd有自己的解析器应用程序:
$ systemd-resolve docs.sbonds.org
docs.sbonds.org: 172.217.9.51
2607:f8b0:4009:801::2013
(ghs.google.com)
-- Information acquired via protocol DNS in 239.1ms.
-- Data is authenticated: no
你仍然需要以某种方式解析它,但它确实提供了直接的最终IP地址(当你调用它时,有一个标志可以让它不遵循CNAME记录,以满足特定需求)。
dig +noall +answer host.example.com | awk '/ IN A\t/ { print $5 }'
- dossyA
后面可能是一个空格,而不是制表符,这取决于很多事情)。试试使用www.icann.org
这个CNAME。解析dig
的输出永远都不是一个好主意,会产生很多特殊情况。 - Patrick Mevzekdig +noall +answer www.icann.org | awk '/\sIN\s+A\s/ { print $5 }'
- dossydig
输出了。但如果你坚持这样做,至少看看+yaml
选项... - Patrick Mevzek