Сравнение сетевого трафика с авторизованными списками через доменное имя - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь проанализировать сетевой трафик и сравнить доменные имена в трафике со списком наиболее распространенных веб-сайтов. намерение состоит в том, чтобы напечатать все имена сайтов, которых нет в списке распространенных веб-сайтов


with open('/Users/downloads/scripting_for_security/resources/top_100.txt') as f:
    safeAdd = f.readlines(),


with open('/Users/downloads/scripting_for_security/resources/traffic_log.txt') as n:
    netTraffic = n.readlines(),

domainTraffic = re.findall(r'\s(?:www.)?(\w+.com)', netTraffic)


for i in safeAdd:
    for e in domainTraffic:
        if i != e:
            print(e)

, получая ошибку типа

TypeError Traceback (последний вызов был последним) в 8netTraffic = n.readlines (), 9 ---> 10 domainTraffic = re.findall (r '\ s (?: www.)? (\ w + .com)', netTraffic) 11 12

~/anaconda3/lib/python3.7/re.py в findall (pattern, string, flags) 221 222 Пустые совпадения включены в результат. "" "-> 223 return _compile (pattern, flags) .findall (строка)224 225 def finditer (pattern, string, flags = 0):

TypeError: ожидаемая строка или байтовоподобный объект

Ответы [ 3 ]

0 голосов
/ 02 октября 2019

Как упоминалось ранее, re.findall ожидает строку, и вы передаете список. Одним из способов решения этой проблемы может быть перебор списка строк (netTraffic) и создание списка всех найденных совпадений (domainTraffic). Я показал это ниже:

with open('/Users/downloads/scripting_for_security/resources/top_100.txt') as f:
    safeAdd = f.readlines(),


with open('/Users/downloads/scripting_for_security/resources/traffic_log.txt') as n:
    netTraffic = n.readlines(),

#initialize empty list
domainTraffic = []

#iterate over each value and add matches to the list
for net in netTraffic:
    domainTraffic.extend(re.findall(r'\s(?:www.)?(\w+.com)', str(net))

#Use list comprehension to filter out the safeAdds
filtered_list = [add for add in domainTraffic if add not in safeAdd]

print(filtered_list)

Вы также можете join список в длинную строку и затем запустить re.findall на объединенной строке. Это действительно зависит от того, какие у вас строки.

0 голосов
/ 02 октября 2019

Проблема в том, что вы передаете list из lines, а не текст re.findall, используйте read() вместо readlines():

with open('data.txt') as f:
    print(type(f.readlines()))  # list
    print(type(f.read()))       # str accepted by the re.findall or any other function

В вашем коде измените это:

safeAdd = f.read()

netTraffic = n.read()

и удалите ,, netTraffic будет tuple содержит один list из lines, проверьте это:

  x = 1, # equavalent to x = (1,)  result is tuple
  x = 1 # is equavalent to x = (1) without "," it's integer
0 голосов
/ 02 октября 2019

netTraffic - это список согласно https://docs.python.org/3/tutorial/inputoutput.html

findall ожидает второй аргумент типа string https://docs.python.org/3/library/re.html#re.findall

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