如何要求“探勘”只返回 CNAME 記錄中的 IP?
該
dig +short
命令(如“ dig show only answer ”中所述)非常適合將名稱批量處理為 IP 地址。它做了一個簡單的工作並且做得很好。不幸的是,當有一個 CNAME 時甚至
+short
還不夠短。例如:$ dig +short docs.sbonds.org ghs.google.com. 173.194.69.121
我已經嘗試過
+noall
,但它似乎並沒有改變+short
. 我也嘗試過指定-t a
只是為了確保它認為我不是指 A 記錄或 CNAME,但這(不出所料)沒有任何改變。$ dig +noall +short docs.sbonds.org ghs.google.com. 173.194.69.121
我正在使用 RedHat 7
dig
:# dig -v DiG 9.9.4-RedHat-9.9.4-73.el7_6
我可以用 trusty 過濾掉 CNAME
grep
,但似乎 dig 應該有某種方式給出“只是 IP,女士”。那是什麼方法?
dig
是一個故障排除工具,因此它發送 DNS 查詢並接收 DNS 答案,正如 Andreas 所說,答案是 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
主持人
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
獲得性
根據你的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(基於 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"
系統
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
任何需要的案例的記錄)