2016-03-22 7 views
0

Ich habe Probleme, das genaue Problem in meinem Code zu lokalisieren. Ich habe zwei Funktionen - inrange(), die überprüft, ob ein Port in Reichweite ist, und filt(), die eine TXT-Datei nimmt, sucht nach den Schlüsselwörtern "UDP" oder "TCP", schaut auf den Port (gleich nach dem: Zeichen) und überprüft, ob diese Zahl innerhalb des Bereichs liegt oder nicht.negative Ergebnisse in Schleife zurück

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 

Dies ist speziell für sshd für jetzt.

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") 

Jetzt funktioniert das, wenn ich dies als meinen Text haben File-

Aktive Verbindungen

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

wie Sie sehen können, UDP 123 ist in Reichweite, wenn Sie im Wörterbuch suchen sshd oben . Ich bekomme eine wahre Aussage zurück. Wenn ich UDP zu TCP ändere, gibt es mir eine negative Aussage zurück. Das funktioniert. Das Problem tritt auf, wenn ich mehr als eine Zeile hinzufüge.

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 

ich wieder alle positiven Ergebnisse:

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

was nicht der Fall sein sollte, als Linie 6 und Linie 8 TCPs sind in Port 123, die nicht in Reichweite ist. Ich fühle mich, als würde ich hier etwas klar übersehen. Kann es nicht herausfinden.

+0

Eine schnelle Debugging-Frage - welche Codezeile macht das Drucken? Vielleicht machen deine 'print'-Aufrufe so etwas wie' Line ... ist eine UDP-Zeile in Reichweite ... '. Das kann helfen, den Fehler zu lokalisieren – dwanderson

+1

Warum sind die 'if'- und' elif'-Abschnitte in der 'inrange'-Funktion identisch? –

+0

@ PM2Ring Vergessen, das zu verwerfen. Ich habe meiner Inrange-Funktion eine Zeicheneingabe hinzugefügt. –

Antwort

3

Sie suchen richtig nach der Zeichenfolge sshd Zeile weise, aber suchen Sie die Zeichenfolgen TCP und UDP in der gesamten Datei. Da es eine Zeile mit UDP und 123 gibt, wird jeder Aufruf von inrange(file, "UDP", int(my_string)): true zurückgeben, selbst wenn in der aktuellen Zeile ein TCP vorhanden ist.

Sie sollten das Proto von der aktuellen Zeile extrahieren. Etwas wie

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

Ihre filt Funktion prüft jeden Port findet es gegen beiden Sätze von Bereichen - ich würde diese Funktion empfehlen Umschreiben das Protokoll aus der Zeile gelesen wird, analysieren und diese Variable zu inrange zusammen mit der Portnummer übergeben.

Eine kleine zusätzliche Anmerkung - in der inrange Funktion testen Sie die gleiche Bedingung in den if und elif Niederlassungen.

Verwandte Themen