Команды nslookup / dig / drill для файла, содержащего веб-сайты для добавления IP-адресов - PullRequest
1 голос
/ 28 марта 2020

ОБНОВЛЕНИЕ : все еще открыт для решений, использующих nslookup without parallel, dig или drill

Мне нужно написать скрипт, который сканирует файл, содержащий адреса веб-страниц в каждой строке и добавляет к этим строкам IP-адрес, соответствующий имени, используя команду nslookup. На данный момент скрипт выглядит следующим образом:

#!/usr/bin/

while read ip
do

   nslookup "$ip" | 
   awk '/Name:/{val=$NF;flag=1;next} /Address:/ &&
        flag{print val,$NF;val=""}' | 
   sed -n 'p;n'

done < is8.input

Входной файл содержит следующие веб-сайты:

www.edu.ro
vega.unitbv.ro

www.wikipedia.org

Окончательный вывод должен выглядеть следующим образом:

www.edu.ro 193.169.21.181
vega.unitbv.ro 193.254.231.35

www.wikipedia.org 91.198.174.192

Основная проблема, с которой я сталкиваюсь в текущем состоянии скрипта, состоит в том, что он берет имена из nslookup (что хорошо для www.edu.ro) вместо того, чтобы брать псевдонимы, когда они доступны. Мой вывод выглядит следующим образом:

www.edu.ro 193.169.21.181
etc.unitbv.ro 193.254.231.35

dyna.wikimedia.org 91.198.174.192

Я думал о реализации if-else для псевдонимов, но я не знаю, как это сделать в текущей команде. Также скрипт может быть изменен, если кто-то лучше понимает, как отформатировать nslookup, чтобы он отображался как приведенный вывод.

Ответы [ 3 ]

2 голосов
/ 29 марта 2020

Минималистский обходной путь квази-ответ. Ниже приведена однострочная замена скрипта с использованием GNU parallel, host (меньше разбора, чем nslookup) и sed:

parallel "host {} 2> /dev/null | 
          sed -n '/ has address /{s/.* /'{}' /p;q}'" < is8.input

. .. или используя nslookup за счет добавленной GNU sed сложности.

parallel "nslookup {} 2> /dev/null | 
          sed -n '/^A/{s/.* /'{}' /;T;p;q;}'"  < is8.input

... или используя xargs:

xargs -I '{}' sh -c \
         "nslookup {}  2> /dev/null | 
          sed -n '/^A/{s/.* /'{}' /;T;p;q;}'"  < is8.input

Вывод любого из них:

www.edu.ro 193.169.21.181
vega.unitbv.ro 193.254.231.35
www.wikipedia.org 208.80.154.224
1 голос
/ 29 марта 2020

Это может сработать для вас (GNU sed и host):

sed '/\S/{s#.*#host & | sed -n "/ has address/{s///p;q}"#e}' file

Для всех непустых строк: вызовите команду host для указанного имени хоста и передайте результаты на другой вызов sed, который удаляет текст и выходит после первого результата.

1 голос
/ 29 марта 2020

Замените полную строку nslookup на:

echo "$IP $(dig +short "$IP" | grep -m 1 -E '^[0-9.]{7,15}$')"
...