Команда dig + short
(например, описанная в « dig show only answer ») отлично подходит для пакетной обработки имен в IP-адреса. Он выполняет простую работу и делает это хорошо.
К сожалению, когда есть CNAME, даже + short
недостаточно коротко. Например:
$ dig +short docs.sbonds.org
ghs.google.com.
173.194.69.121
Я пробовал + noall
, но не похоже, что это меняет поведение + short
. Я также попытался указать -ta
, чтобы убедиться, что он не думал, что я имел в виду запись 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
Я могу отфильтровать CNAME с помощью надежного grep
, но похоже, что у dig должен быть какой-то способ выдать «Только IP, мэм».
Что такое таким образом?
dig
- это инструмент для устранения неполадок, поэтому он отправляет запросы DNS и получает ответы DNS, и, как сказал Андреас, ответом являются записи 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
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
источник данных для каждой службы, а для хостов
это, вероятно, будет смесь как файлов
(который является почтенным / 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 -MSocket -E 'say inet_ntoa(inet_aton("docs.sbonds.org"))'
172.217.4.179
Или используйте любую конечную точку DOH (DNS через 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-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
для любых случаев использования, в которых это необходимо)
И CNAME, и соответствующий A (или любой другой тип, который вы запрашивали) принадлежат разделу ответов. Таким образом, нет опции раскопок (по крайней мере, в раскопках RHEL7), которая могла бы отфильтровать ответ CNAME.
Я думаю, вам придется положиться на dig + short [...] | grep -v '\. $'
, чтобы удалить ответы CNAME.