Ускорить dig -x в скрипте bash

Мне нужно запустить в качестве упражнения в моем университете сценарий bash для обратного поиска всех их записей DNS для сетевого блока класса B, которым они владеют.

Это самое быстрое, что у меня есть, но занимает вечность. Любая помощь в оптимизации этого кода?

#!/bin/bash
network="a.b"

CMD=/usr/bin/dig

for i in $(seq 1 254); do

    for y in $(seq 1 254); do
        answer=`$CMD -x $network.$i.$y +short`; 
        echo $network.$i.$y ' resolves to ' $answer >> hosts_a_b.txt;
    done
done

person The Shidoshi    schedule 06.03.2019    source источник
comment
Подумайте о GNU Parallel, если вы хотите делать много вещей параллельно...   -  person Mark Setchell    schedule 06.03.2019
comment
Выполнение более 64000 DNS-запросов займет некоторое время, независимо от того, как вы это делаете.   -  person Barmar    schedule 06.03.2019


Ответы (1)


Использование GNU xargs для одновременного запуска 64 процессов может выглядеть так:

#!/usr/bin/env bash

lookupArgs() {
  for arg; do
    # echo entire line together to ensure atomicity
    echo "$arg resolves to $(dig -x "$arg" +short)"
   done
}
export -f lookupArgs

network="a.b"
for (( x=1; x<=254; x++ )); do
  for (( y=1; y<=254; y++ )); do
    printf '%s.%s.%s\0' "$network" "$x" "$y"
  done
done | xargs -0 -P64 bash -c 'lookupArgs "$@"' _ >hosts_a_b.txt

Обратите внимание, что это не гарантирует порядок вывода (и полагается на то, что функция lookupArgs выполняет один системный вызов write() для каждого результата), но вывод можно сортировать, поэтому у вас должна быть возможность изменить порядок. В противном случае можно было бы получить упорядоченный вывод (и обеспечить атомарность результатов), переключившись на параллельный GNU — большой сценарий Perl, а не на небольшую, простую реализацию GNU xargs с относительно низким набором функций.

person Charles Duffy    schedule 06.03.2019
comment
Большое спасибо. Это значительно быстрее. То же сканирование заняло больше часа с моим кодом, но только 26 минут с вашей модификацией. - person The Shidoshi; 06.03.2019
comment
Это довольно опасное решение: в этом случае оно сработает (обратные имена обычно намного короче 1000 байт), но вы играете с огнем. Более длинные строки (>1008 байт) или многократная запись откроют вам условия гонки с смешиванием полустрок. Не подчеркивая ограничения, создается впечатление, что вы о них не знаете: mywiki.wooledge.org / - person Ole Tange; 18.03.2019
comment
Вы видели, как я подчеркивал эти ограничения в других ситуациях, когда можно разумно ожидать, что они будут затронуты — это не первое наше обсуждение этой темы. Тем не менее, здесь можно было бы разумно сделать немного больше акцента, и я соответствующим образом отредактировал. - person Charles Duffy; 18.03.2019