该dig +short命令(如“ dig show only answer ”中所述)非常适合将名称批量处理为 IP 地址。它完成了一项简单的工作并且做得很好。
不幸的是,当有 CNAME 时甚至+short还不够短。例如:
$ dig +short docs.sbonds.org
ghs.google.com.
173.194.69.121
Run Code Online (Sandbox Code Playgroud)
我试过了,+noall但它似乎没有改变+short. 我也尝试过指定-t a只是为了确保它不认为我的意思是 A 记录或 CNAME,但这(不出所料)没有任何改变。
$ dig +noall +short docs.sbonds.org
ghs.google.com.
173.194.69.121
Run Code Online (Sandbox Code Playgroud)
我正在使用 RedHat 7 的dig:
# dig -v
DiG 9.9.4-RedHat-9.9.4-73.el7_6
Run Code Online (Sandbox Code Playgroud)
我可以用 trusty 过滤掉 CNAME grep,但似乎 dig 应该有办法给出“只是 IP,女士”。
那是什么方式?
Pat*_*zek 13
dig是一个故障排除工具,因此它发送 DNS 查询并接收 DNS 答案,正如 Andreas 所说,答案是设计的 CNAME 和 A 记录。您的愿望是提供“只是 IP,女士。”,所以这不是 DNS 故障排除,而是“只是”解析,这dig太过分了。
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
Run Code Online (Sandbox Code Playgroud)
host 更简单,但仍会为您返回“太多”(但请注意,它还返回了很好的 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
Run Code Online (Sandbox Code Playgroud)
根据你的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
Run Code Online (Sandbox Code Playgroud)
另请注意,在正确的 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
Run Code Online (Sandbox Code Playgroud)
如果允许您编写一个简单的脚本,则有很多解决方案,例如:
$ perl -MSocket -E 'say inet_ntoa(inet_aton("docs.sbonds.org"))'
172.217.4.179
Run Code Online (Sandbox Code Playgroud)
或者将任何 DOH(HTTPS 上的 DNS)端点(或类似的)用于任何 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"
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
您仍然需要以某种方式解析它,但它确实提供了直接的最终 IP 地址(调用它时有一个标志,使其不遵循CNAME任何需要的用例的记录)
And*_*gge 10
CNAME 和相应的 A(或您要求的任何类型)都属于答案部分。因此,没有 dig 选项(至少在 RHEL7 的 dig 中没有)可以过滤掉 CNAME 响应。
我认为您将不得不依靠dig +short [...] | grep -v '\.$'删除 CNAME 响应。
| 归档时间: |
|
| 查看次数: |
10662 次 |
| 最近记录: |