script / command para obter IPs da lista de nomes de host e combiná-los em um único arquivo

4

Isso está além das minhas habilidades atuais, parece que eu tenho tentado por um tempo e não tenho feito muito progresso.

Fui solicitado a obter uma lista de hosts e IPs para que a segurança executasse uma varredura nesses servidores. Existe uma lista de host chamada hosts.linux no servidor com todos os nomes de host, apenas sem IPs. Eu estou tentando chegar a um script que levará os nomes desse arquivo e, em seguida, execute um comando como o comando host para obter o IP.

Este comando funciona por exemplo:

host csx-svc-spls-06 | awk '{ print $3 }'

e retorna apenas o IP desse servidor. É possível ler o arquivo, executá-lo e exportar o nome do servidor e, em seguida, o endereço IP em uma linha para um novo arquivo?

    
por Ivan Windon 16.02.2018 / 19:37

3 respostas

1

Não tenho certeza das implicações do uso do nslookup sobre a escavação, mas acho que isso pode funcionar:

for i in 'cat linux.hosts'; do nslookup $i | grep ^Name -A1| awk '{print $2}';echo;done > outputfile
    
por 16.02.2018 / 20:43
1

dig tem uma opção +short que faz com que produza apenas os endereços IP resultantes e nada mais.

Este código:

for h in google.com yahoo.com notfound.nosuch; do
  printf '%s = ' "$h"
  printf '%s' "$(dig +short "$h")" | tr '\n' ,
  echo
done

Produz a saída:

google.com = 108.177.112.102,108.177.112.139,108.177.112.101,108.177.112.138,108.177.112.100,108.177.112.113
yahoo.com = 98.138.252.38,98.139.180.180,206.190.39.42
notfound.nosuch = 

Por outro lado, este código:

for h in google.com yahoo.com notfound.nosuch; do
  printf "$h = %s\n" $(dig +short "$h")
done

Produz a saída:

google.com = 108.177.112.138
google.com = 108.177.112.100
google.com = 108.177.112.101
google.com = 108.177.112.113
google.com = 108.177.112.139
google.com = 108.177.112.102
yahoo.com = 98.139.180.180
yahoo.com = 206.190.39.42
yahoo.com = 98.138.252.38
notfound.nosuch = 

Para ler os nomes de host de um arquivo, substitua as linhas for em qualquer um dos trechos de código acima por for h in $(cat hostlist.txt); do - embora você queira adicionar alguma validação de entrada. Até você.

Faça a sua escolha. Se você quiser outro formato, por favor comente.

Nota: se todos forem os endereços IP e você não se importa em ter os nomes de host incluídos na saída, então todos você precisa é:

dig +short $(cat hostlist.txt)

Tenha em mente, porém, que qualquer nome de host que não apareça no DNS será silenciosamente ignorado com este comando.

    
por 16.02.2018 / 22:13
-1

Para apenas iterar pela lista com o comando que você usou em um único host (ligeiramente modificado para incluir também o próprio nome do host):

while read h; do
    host "$h" | awk '{ print $1, $3 }'
done <linux.hosts >outputfile.txt

Isso lê a partir de linux.hosts , aplica os comandos host e awk em cada entrada lá e salva o resultado em outputfile.txt .

Ou, se preferir, em uma linha:

while read h; do host "$h" | awk '{ print $1, $3 }'; done <linux.hosts >outputfile.txt

O seguinte é uma abordagem muito mais genérica que leva aliases de nome de host e vários endereços IP em conta e produz uma linha de saída para cada linha de entrada no arquivo fornecido:

Dada uma lista de hosts em hostnames.txt , como

www.uu.se
www.kth.se
www.su.se

Em seguida, dado um pequeno script awk ( script.awk ),

/^;/ || NF == 0 { next }

$4 == "CNAME"   { cn[$5] = (cn[$5] ? cn[$5] "," $1 : $1) }
$4 == "A"       { ip[$1] = (ip[$1] ? ip[$1] "," $5 : $5) }

END {
    for (i in ip) {
        if (cn[i])
            printf("%s (%s) = ", i, cn[i])
        else
            printf("%s = ", i)

        print ip[i]
    }
}

A linha de comando bash

dig +noall +answer -f hostnames.txt | awk -f script.awk

produziria

su.se. (www.su.se.) = 193.11.30.171
www.kth.se. = 130.237.28.40
live.webb.uu.se. (www.uu.se.) = 130.238.7.135,130.238.7.133,130.238.7.134

Isso leva aliases de nome de host e hosts com vários endereços IP em conta. Os aliases do nome do host são os nomes entre parênteses.

O comando dig por si só produziria a saída

; <<>> DiG 9.4.2-P2 <<>> www.uu.se +noall +answer
;; global options:  printcmd
www.uu.se.              300     IN      CNAME   live.webb.uu.se.
live.webb.uu.se.        300     IN      A       130.238.7.134
live.webb.uu.se.        300     IN      A       130.238.7.135
live.webb.uu.se.        300     IN      A       130.238.7.133
www.kth.se.             600     IN      A       130.237.28.40
www.su.se.              300     IN      CNAME   su.se.
su.se.                  300     IN      A       193.11.30.171

e ele faz através de uma consulta em lote ( -f ) na lista de nomes de host.

Isso é o que o código awk analisa e resume.

O script awk detecta as entradas CNAME para aliases de nome do host e salva uma lista de aliases separados por vírgulas para cada nome de host real no array cn e faz uma operação semelhante para salvar os endereços IP no ip array para cada nome de host.

O bloco END passa pelos nomes de host na matriz ip e verifica se possui aliases ou não. Se tiver, estes são impressos entre parênteses. Em seguida, a lista de números IP é adicionada ao final da linha.

    
por 16.02.2018 / 21:43