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
-einforma aechoque eu usarei sequências scape e . Nesse caso, estou usando\tque, 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 sintaxebashse 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.