Как мне попросить «копать», чтобы вернуть только IP из записи CNAME?

Команда 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, мэм».

Что такое таким образом?

2
задан 1 May 2019 в 06:32
2 ответа

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

host

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

getent

В зависимости от вашей системы 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

Если вам разрешено писать простой сценарий, у вас есть много решений, например:

$ perl -MSocket -E 'say inet_ntoa(inet_aton("docs.sbonds.org"))'
172.217.4.179

DOH

Или используйте любую конечную точку 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 имеет собственное приложение-преобразователь:

$ 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 для любых случаев использования, в которых это необходимо)

6
ответ дан 3 December 2019 в 08:52

И CNAME, и соответствующий A (или любой другой тип, который вы запрашивали) принадлежат разделу ответов. Таким образом, нет опции раскопок (по крайней мере, в раскопках RHEL7), которая могла бы отфильтровать ответ CNAME.

Я думаю, вам придется положиться на dig + short [...] | grep -v '\. $' , чтобы удалить ответы CNAME.

2
ответ дан 3 December 2019 в 08:52

Теги

Похожие вопросы