Как связать два индекса в многомерном списке и сопоставить с другими - PullRequest
2 голосов
/ 25 октября 2019

Используя выходные данные tcpdump, я хочу создать скрипт, который будет суммировать IP-адрес источника-получателя, время начала-остановки, сколько пакетов найдено, какая сумма длины пакета

В настоящее время для достижения этой цели я создал многомерный список, который содержит данные, подобные приведенным ниже, и извлечен из tcpdump

[['10.247.15.39', '172.217.2.161', '13:25:31', '46'], ['10.247.15.39', '172.217.2.163', '13:25:31', '46'], ['172.217.2.161', '10.247.15.39', '13:25:31', '0'],...

. Здесь более 3000 записей

Теперь мне нужнонайти другие записи, которые имеют одинаковые исходный и IP-адрес назначения , затем, когда совпадение найдено, скажем, 10 найденных совпадений будет найдено для этой конкретной пары

Я хочу, чтобы оно суммировалось какthis

Требуемый вывод:

Source: 151.101.125.140     dest: 10.247.15.39  start:13:25:31 
stop:13:25:35 package amount:10  total length: 1965482

Время запуска и остановки, определенное на основе времени поиска и последнего найденного пакета

И я хочу сохранить егоПовторите один и тот же процесс для каждой пары исходного и целевого IP, поэтому в основном создаст сводный список, чтобы я мог посмотреть на него и посмотреть, не произошло ли слишком много трафика между двумя IP

* 10. 30 * Но я понятия не имею, как я могу соединить два индекса и искать совпадения в списке.

Я думал сделать что-то вроде

filtered_list = []
i = 0
i_2 = 1
try:
    while i <= len(parse_output):
        if parse_output[i][0] == parse_output[i_2][0]:
            print("source ip same")
            if parse_output[i][1] == parse_output[i_2][1]:
                print("destination same")
        i = i + 1
        i_2 = i + 1
except IndexError:

Но просто мой мозг остановился, еслиВы можете помочь мне, я был бы рад

1 Ответ

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

Проблема

Повторное размещение (модифицированного) кода, который вы имели в своем первоначальном вопросе, как это уместно здесь:

parse_output = [
    '10.247.15.39', '172.217.2.161', '13:25:31', '46',
    '10.247.15.39', '172.217.2.163', '13:25:31', '46',
    '172.217.2.161', '10.247.15.39', '13:25:31', '0'
]
for i in range(0, len(parse_output), 4):
    newlist = []
    newlist.append("source: " + parse_output[i] +
        " destination: " + parse_output[i + 1] +
        " time: " + parse_output[i + 2] + 
        " package size: "+ parse_output[i + 3])
    print(newlist)

, который производит этот вывод:

['source: 10.247.15.39 destination: 172.217.2.161 time: 13:25:31 package size: 46']
['source: 10.247.15.39 destination: 172.217.2.163 time: 13:25:31 package size: 46']
['source: 172.217.2.161 destination: 10.247.15.39 time: 13:25:31 package size: 0']

Цель - ['source: 10.247.15.39 destination: 172.217.2.161 time: 13:25:31 number of packet:5 total packet size: 46'], которая включает два IP-адреса, метку времени, количество пакетов и общий размер пакета первого пакета.

Решение

Вся необходимая информация, кромедлина присутствует в первом пакете, поэтому нет необходимости в цикле for. В каждом пакете имеется 4 фрагмента данных, поэтому количество пакетов можно получить, разделив длину parse_input на 4. В этом примере создайте 12 «пакетов» в качестве входных данных.

packet = ['10.247.15.39', '172.217.2.161', '13:25:31', '46']
parse_output = 12*packet
number_of_packets = int(len(parse_output)/4)
total_packet_size = sum([int(i) for i in parse_output[3::4]])
newlist = [
    "source: " + parse_output[0] +
    " destination: " + parse_output[1] +
    " start: " + parse_output[2] +
    " stop: " + parse_output[-2] +
    " number of packets:" + str(number_of_packets) +
    " total packet size: " + str(total_packet_size)
]
print(newlist)
...