Como obter dig + short para retornar algo quando não há resposta?

5

O comportamento de dig +short é retornar nada (nulo) ao executar uma consulta que não retorna nenhuma resposta (nada a ver com tempo limite, apenas uma resposta vazia).

Está tudo bem ao executar uma consulta por si só, mas ao combinar com um parâmetro -f e executar um lote de consultas, é ruim!

dig +short -f queries.txt

queries.txt: A somedomain.com TXT otherdomain.com A somedomain.com

Agora, se o servidor dns não retornar nada para TXT otherdomain.com (ou seja, ANSWER: 0), não timeout ou qualquer outra coisa, a saída do comando dig acima será algo como:

dig +short -f queries.txt 1.2.3.4 1.2.3.4

i.e. apenas 2 linhas. não é bom para "colar" e outros comandos semelhantes. você não pode mais mesclar a saída de queries.txt e a saída de dig.

Qualquer coisa elegante pode ser feita aqui?

    
por Alex 12.08.2014 / 08:35

2 respostas

4

Não existe uma maneira real de fazer +short fazer o que você deseja nesse contexto. É simplesmente a ferramenta errada para o trabalho ao trabalhar com dados em massa.

A solução que encontrei ao encontrar esse problema foi usar uma combinação de filtros: +noall +question +answer . +noall desativa todos os campos de exibição, +question exibe a consulta sendo feita com um prefixo ; comment e +answer exibe a resposta.

A saída é assim:

$ dig +noall +question +answer google.com serverfault.com
;google.com.                    IN      A
google.com.             284     IN      A       74.125.137.101
google.com.             284     IN      A       74.125.137.138
google.com.             284     IN      A       74.125.137.102
google.com.             284     IN      A       74.125.137.100
google.com.             284     IN      A       74.125.137.113
google.com.             284     IN      A       74.125.137.139
;serverfault.com.               IN      A
serverfault.com.        187     IN      A       198.252.206.16

Caso você não receba resposta, você verá duas perguntas adjacentes. Você não saberá porque a consulta falhou, pois essa saída não exibe um RCODE (nem +short ), mas a saída é suficiente para analisar um conjunto de dados em massa e localizar registros que precisam de mais análise detalhada.

Se você estiver fazendo uma análise em massa de referências de DNS, alterne +answer para +authority .

    
por 12.08.2014 / 15:50
0

Acho que esse script python funcionaria.

from subprocess import Popen, PIPE

def dig(z):
    proc = Popen(
        args='dig +short {} | head -n 1'.format(z),
        shell=True, stdout=PIPE
    )
    return proc.communicate()[0]

result = dict()
with open('queries.txt') as zones:
    for zone in zones.readlines():
        zone = zone.rstrip()
        result[zone] = dig(zone)

with open('queries.txt', 'w+') as results:
    for key, value in result.items():
        if value == '':
            value = 'no answer\n'
        results.write('{} : {}'.format(key, value))
    
por 12.08.2014 / 11:08