Python3 - фильтровать текст перед записью в файл - PullRequest
0 голосов
/ 15 января 2019

Это функция, которая вызывается моим сценарием main.py.

В этом и заключается проблема, у меня есть файл со списком IP-адресов, и я запрашиваю этот API, чтобы найти обратный DNS-поиск этих данных IP по переменной (url). Затем выплевывает "response.text".

Хорошо в файле response.text,

Я не получаю DNS A-записей для 96.x.x.x

Другие данные, которые я получаю, это просто имя DNS: 'subdomain.domain.com'

Как мне отфильтровать результаты, чтобы они НЕ отображались для каждого 'Нет записей DNS A, найденных для (показывает whateverip)'

#!/usr/bin/env python3
import requests
import pdb
#function to use hackertarget api for reverse dns lookup
def dns_finder(file_of_ips="endpointslist"):
    print('\n\n########## Finding DNS Names ##########\n')
    targets = open("TARGETS","w")
    with open (file_of_ips) as f:
        for line in f:
            line.strip()
            url = 'https://api.hackertarget.com/reverseiplookup/?q=' + line
            response = requests.get(url)
            #pdb.set_trace()
            hits = response.text
            print(hits)
            targets.write(hits)
            return hits

Ответы [ 2 ]

0 голосов
/ 15 января 2019

@ Тим Кляйн: Ответ хорош, если вы хотите сохранить только доменные имена. Однако, как указано в вопросе, если вы просто хотите удалить сообщения об ошибках типа «Нет записей DNS A для ...», то вы можете использовать метод str.startswith:

#!/usr/bin/env python3
import requests
import pdb
#function to use hackertarget api for reverse dns lookup
def dns_finder(file_of_ips="endpointslist"):
    print('\n\n########## Finding DNS Names ##########\n')
    targets = open("TARGETS","w")
    with open (file_of_ips) as f:
        for line in f:
            line.strip()
            url = 'https://api.hackertarget.com/reverseiplookup/?q=' + line
            response = requests.get(url)
            #pdb.set_trace()
            hits = response.text
            print(hits)
            if not hits.startswith("No DNS A records found for"):
                targets.write(hits)
            return hits # why iterating if you return there ?
0 голосов
/ 15 января 2019

Вы можете использовать модуль re, чтобы проверить ответ и убедиться, что это действительное имя хоста DNS (с использованием шаблона регулярного выражения):

import re

# ... rest of your code

# before writing to targets file
if re.match('^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$', hits) is not None:
    targets.write(hits)

Функция re.match() возвращает объект соответствия, если данная строка соответствует регулярному выражению. В противном случае он вернет None. Поэтому, если вы проверите, чтобы убедиться, что это не None, тогда он должен соответствовать регулярному выражению (то есть он соответствует шаблону для имени хоста DNS). Вы можете изменить регулярное выражение или абстрагировать проверку на более общий isValidHit(hit) и поместить любую функциональность, которую вы хотите, чтобы она проверяла не только имена хостов DNS.

Примечание

Вы хотите быть осторожным со своей линией targets = open("TARGETS","w"). Это открывает файл для записи, но вам нужно вручную закрыть файл в другом месте и обработать все ошибки, связанные с вводом-выводом.

Вам следует пытаться использовать with open(filename) as blah: при работе с файлом IO. Это намного безопаснее и проще в обслуживании.

Редактировать

Найдено простое регулярное выражение для адреса IPv4 здесь .

Добавить более подробное описание функции регулярного выражения match.

Редактировать 2

Я просто перечитал ваш пост и увидел, что вы на самом деле ищете не адреса IPv4, а имена DNS-узлов ...

В этом случае вы можете просто переключить шаблон регулярного выражения на ^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$. Источник для DNS-имени хоста regex .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...