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
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?
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
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.
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.
Tags command-line awk shell-script