Se o seu objetivo desejado é apenas criar uma tabela de nomes de host e endereços IP, e você não se importa particularmente com o uso de nslookup
, consegui criar a saída desejada com um loop for .. echo
rápido:
for h in $( cat hosts.list ); do
a=$(dig +short $h | head -n1)
echo -e "$h\t${a:-Did_Not_Resolve}"
done
dig
é uma ferramenta de DNS um pouco mais amigável para scripts do que é nslookup
, o uso da opção +short
torna a saída ainda mais limpa. A saída de uma solicitação para a qual não há registro é uma cadeia vazia, portanto, uso a expansão de parâmetro padrão bash
integrada ( ${var:-default}
) para manipular o caso de nenhum registro fornecendo uma resposta "padrão" de Did_Not_Resolve
.
$ dig www.example.com
; <<>> DiG 9.10.6 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23579
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 20308 IN A 93.184.216.34
;; Query time: 28 msec
;; SERVER: 172.28.8.1#53(172.28.8.1)
;; WHEN: Fri Jun 01 12:02:27 MST 2018
;; MSG SIZE rcvd: 60
$ dig +short www.example.com
93.184.216.34
O rendimento final é essa saída:
www.example.com 93.184.216.34
www.google.com 172.217.14.68
host.doesnotexist.tld Did_Not_Resolve
unix.stackexchange.com 151.101.129.69
Uma alternativa para dig
também é host
:
$ for h in $(cat hosts.list); do host $h; done
www.example.com has address 93.184.216.34
www.example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
www.google.com has address 216.58.193.196
www.google.com has IPv6 address 2607:f8b0:4007:80d::2004
Host host.doesnotexist.tld not found: 3(NXDOMAIN)
unix.stackexchange.com has address 151.101.129.69
unix.stackexchange.com has address 151.101.1.69
unix.stackexchange.com has address 151.101.65.69
unix.stackexchange.com has address 151.101.193.69
Em resposta às perguntas do comentário abaixo:
A única opção que eu uso para dig
é +short
, o que reduz a saída para o endereço IP do host fornecido ou uma string vazia. Eu corro dig
em uma subshell ( $( dig [...] )
) porque estou capturando sua saída e atribuindo-a à variável a
(para "endereço"). Estou canalizando a saída de dig
a head -n1
como alguns hosts (como o host unix.stackexchange.com
retorna vários endereços IP; para simplificar, simplesmente pego o primeiro.
A razão pela qual isso está sendo extraído em uma variável é para que possamos usar um truque de expansão de parâmetro simples para fornecer o texto "Não resolve" em vez de uma string vazia, conforme descrito anteriormente aqui.
Expandindo conforme solicitado na declaração echo
especificamente:
echo -e "$h\t${a:-Did_Not_Resolve}"
- A opção
-e
informa aecho
que eu usarei sequências scape e . Nesse caso, estou usando\t
que, quando combinado com-e
, se torna uma Tab em vez de um literal com escapet
. -
$h
é, como seria de esperar, simplesmente substituído pelo conteúdo da variávelh
. -
\t
, conforme explicado anteriormente, torna-se uma guia. -
%código%. Aqui está a mágica.
${a:-Did_Not_Resolve}
tem a capacidade de fazer a expansão de parâmetros para fazer um pouco de introspecção como parte do processo. A sintaxebash
se expande para o conteúdo da variável${var:-default}
ou var ; ou no uso real caso aqui,default
). Você pode encontrar mais detalhes sobre isso na página de manualDid_Not_Resolve
, na seção "Expansão de Parâmetros".
O resultado final disso é a saída em cada linha, na seguinte ordem, o nome do host, uma aba e o endereço, se houver um, ou o texto bash
, se houver não.