2016-03-22 2 views
0

У меня возникли проблемы с определением точной проблемы в моем коде. У меня есть две функции: inrange(), которая проверяет, находится ли порт в диапазоне, и filt(), который берет txt-файл, ищет ключевые слова «UDP» или «TCP», смотрит на порт (сразу после знака: , и проверяет, находится ли это число в пределах диапазона или нет.возвращение отрицательных результатов в цикле

def inrange(file,character, num): 
    with open(file, 'r') as r: 
     for lines in r: 
      for key, value in sshd.items(): 
       if character == key and character in lines: 
        if num in sshd.get(character): 
         return True 
        else: 
         return False 

       elif character == key and character in lines: 
        if num in sshd.get(character): 
         return True 
        else: 
         return False 

Это специально для sshd пока.

def filt(file): 
    with open(file, 'r') as r: 
     for i, line in enumerate(r): 
      if "sshd" in line: 
       plusOne = i + 1 
       newline = line.strip() 
       splitIt = newline[7:22] 
       my_string = splitIt.split(":", 1)[1] 
       if inrange(file, "TCP", int(my_string)): 
        print("Line " + str(plusOne) + " is in range" + " " + my_string)  
       elif inrange(file, "UDP", int(my_string)): 
        print("Line " + str(plusOne) + " is in range" + " " + my_string)  
       else: 
        print("Not in range") 

Теперь это работает, если у меня есть это как мой текст файл-

активных соединений

Proto Local Address   Foreign Address  State   PID 
    UDP 0.0.0.0:123    0.0.0.0:0    LISTENING  5987 sshd 

, как вы можете видеть, UDP 123 находится в пределах диапазона, если вы посмотрите на словарю sshd выше , Я получаю истинное заявление взамен. Если я изменю UDP на TCP, он вернет отрицательный результат. Это работает. Проблема возникает, когда я добавляю к ней несколько строк.

Active Connections 

    Proto Local Address   Foreign Address  State   PID 
    UDP 0.0.0.0:123    0.0.0.0:0    LISTENING  5987 sshd 
    TCP 0.0.0.0:123    0.0.0.0:0    LISTENING  5987 sshd 
    UDP 0.0.0.0:123    0.0.0.0:0    LISTENING  5987 sshd 
    TCP 0.0.0.0:123    0.0.0.0:0    LISTENING  5987 sshd 

я получить обратно все положительные результаты:

Line 5 is in range 123  
Line 6 is in range 123  
Line 7 is in range 123  
Line 8 is in range 123 

, который не должен быть случай, так как строка 6 и 8 представляют собой линии ПТС в порт 123, который не находится в диапазоне. Я чувствую, что мне не хватает чего-то здесь. Не могу понять это.

+0

Один вопрос быстрой отладки - какая строка кода выполняет печать? Возможно, ваши вызовы 'print' будут похожи на' Line ... - это строка UDP в диапазоне ... '. Это может помочь определить ошибку – dwanderson

+1

Почему разделы 'if' и' elif' в функции 'inrange' идентичны? –

+0

@ PM2Ring Забыл об этом. Я добавил ввод символов в мою функцию ввода. –

ответ

3

Вы правильно найдете строку sshd строку мудрый, но найдите строки TCP и UDP всего файла. Поскольку есть одна строка с UDP и 123, каждый вызов inrange(file, "UDP", int(my_string)): вернет true, даже если в текущей строке есть TCP.

Вы должны извлечь прото из текущей строки. Что-то вроде

proto = newline[:3] 
    if (proto in ['UDP', 'TCP']) and inrange(file, proto, int(my_string)): 
     print("Line " + str(plusOne) + " is in range" + " " + my_string)  
    else: 
     print("Not in range") 
1

Ваших filt функция проверяет каждый порт находит против обоего наборов диапазонов - я предложил бы переписывать эту функцию, чтобы разобрать протокол от линии считывания, и передать эту переменную inrange вместе с номером порта.

Небольшая дополнительная нота - в функции inrange вы испытываете одинаковое состояние как в ветвях if, так и в elif.

Смежные вопросы