nslookup awk para um arquivo mostrando “answer”

2

Atualmente, estou executando um script que usa o nslookup em vários hosts e, em seguida, usa o awk para imprimir as linhas desejadas em uma tabela. Estou imprimindo uma linha para o arquivo1 e outra para o arquivo2 e, em seguida, usando paste file1 file2 >> file3 para produzir essa tabela.

A tabela parece com isso

Host   IP
name  10.10.10.10
name  10.10.10.10
name 10.10.10.10

Na maior parte, isso está funcionando. Mas, por alguma razão, cerca de 20 dos meus 160 resultados estão recebendo "answer:" na coluna da esquerda, e o nome do host está aparecendo à direita. Assim:

Host IP
answer:  hostname

Isso está aparecendo aleatoriamente em todos os resultados e não consigo descobrir porque o nslookup não tem a palavra "answer:" em qualquer lugar para o script acidentalmente awk.

Aqui está o meu script para referência:

hosts='hosts.list'
filelines='cat $hosts'

Empty_Containers(){
        truncate -s 0 tmp.txt
        truncate -s 0 file1
        truncate -s 0 file2
}

for h in $filelines ;
do
        Empty_Containers
        nslookup $h > tmp.txt
        if grep -q "NXDOMAIN" tmp.txt
        then
                cat tmp.txt | awk 'FNR ==4 {print$5}' > file1
                echo "Did_Not_Resolve" > file2
                paste file1 file2 >> i.txt
        else
                cat tmp.txt | awk 'FNR ==4 {print$2}' > file1
                cat tmp.txt |awk 'FNR ==5 {print$2}' > file2
                paste file1 file2 >> i.txt
        fi
        cat i.txt | column -t 2 i.txt
done
    
por mitchelwith1el 01.06.2018 / 19:52

1 resposta

1

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 a echo 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 escape t .
  • $h é, como seria de esperar, simplesmente substituído pelo conteúdo da variável h .
  • \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 sintaxe bash 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 manual Did_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.

    
por 01.06.2018 / 20:25

Tags