Wie werte ich die IP am besten aus?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Guten Tag alle zusammen.

Ich Programmier mir grade eine Portscanner, damit ich Zukunft was zum vorzeigen habe, wenn ich mich bewerben möchte. :)
Es Soll möglich sein eine Ip zu scannen oder auch eine Ip - range.

ich habe eine Entry Box für die IP. Diese wird überprüft und in dies Format gebracht:

Code: Alles auswählen

 ip = [[12], [168], [1, 5], [15, 30]]
Der User hat die IP 12.168.1-5.15-30 eingeben und möchte nun alle Ip's scannen.
Ich habe mich an eine sinnvolle auswertung dran gemacht, aber ich denke das ist zu kompliziert.

Code: Alles auswählen

def main():
    ip = [[1, 12], [1, 168], [10], [15]]

    if len(ip[0]) == 2:
        for sub0 in range(ip[0][0], ip[0][1]+1):
            if len(ip[1]) == 2:
                for sub1 in range(ip[1][0], ip[1][1]+1):
                    if len(ip[2]) == 2:
                        for sub2 in range(ip[2][0], ip[2][1]+1):
                            if len(ip[3]) == 2:
                                for i in range(ip[3][0], ip[3][1]+1):
                                    print(sub0, sub1, sub2, i)
                            else:
                                for sub3 in ip[3]:
                                    print(sub0, sub1, sub2, sub3)
                    else:
                        for sub2 in ip[2]:
                            if len(ip[3]) == 2:
                                for sub3 in range(ip[3][0], ip[3][1]+1):
                                    print(sub0, sub1, sub2, sub3)
                            else:
                                for sub3 in ip[3]:
                                    print(sub0, sub1, sub2, sub3)
        else:
            for sub1 in ip[1]:
                if len(ip[2]) == 2:
                    for sub2 in range(ip[2][0], ip[2][1]+1):
                        if len(ip[3]) == 2:
                            for i in range(ip[3][0], ip[3][1]+1):
                                print(sub0, sub1, sub2, i)
                        else:
                            for sub3 in ip[3]:
                                print(sub0, sub1, sub2, sub3)
                else:
                    for sub2 in ip[2]:
                        if len(ip[3]) == 2:
                            for sub3 in range(ip[3][0], ip[3][1]+1):
                                print(sub0, sub1, sub2, sub3)
                        else:
                            for sub3 in ip[3]:
                                print(sub0, sub1, sub2, sub3)
    else:
        for sub0 in ip[0]:
            if len(ip[1]) == 2:
                for sub1 in range(ip[1][0], ip[1][1]+1):
                    if len(ip[2]) == 2:
                        for sub2 in range(ip[2][0], ip[2][1]+1):
                            if len(ip[3]) == 2:
                                for i in range(ip[3][0], ip[3][1]+1):
                                    print(sub0, sub1, sub2, i)
                            else:
                                for sub3 in ip[3]:
                                    print(sub0, sub1, sub2, sub3)
                    else:
                        for sub2 in ip[2]:
                            if len(ip[3]) == 2:
                                for sub3 in range(ip[3][0], ip[3][1]+1):
                                    print(sub0, sub1, sub2, sub3)
                            else:
                                for sub3 in ip[3]:
                                    print(sub0, sub1, sub2, sub3)
        else:
            for sub1 in ip[1]:
                if len(ip[2]) == 2:
                    for sub2 in range(ip[2][0], ip[2][1]+1):
                        if len(ip[3]) == 2:
                            for i in range(ip[3][0], ip[3][1]+1):
                                print(sub0, sub1, sub2, i)
                        else:
                            for sub3 in ip[3]:
                                print(sub0, sub1, sub2, sub3)
                else:
                    for sub2 in ip[2]:
                        if len(ip[3]) == 2:
                            for sub3 in range(ip[3][0], ip[3][1]+1):
                                print(sub0, sub1, sub2, sub3)
                        else:
                            for sub3 in ip[3]:
                                print(sub0, sub1, sub2, sub3)

if __name__ == '__main__':
    main()

Das Ergbniss ist manchmal falsch und manchmal richtig.. Ich denke es geht auch wesentlich einfacher, deshalb meine frage:
wie kann ich das einfacher auswerten? Dabei darf das format von der Variablen IP geändert werden.

MfG
Trayser
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Lösch den ganzen Code und nimm ipaddress.
BlackJack

@TrayserCassa: Als erstes würde ich bei der Datenstruktur vereinfachen. Das heisst eine regelmässige Struktur verwenden und nicht mal einen und mal zwei Einträge in den inneren Listen. Wenn man da grundsätzlich den allgemeineren Fall, also Start- und Endwert verwendet, vereinfacht das den Code der damit arbeiten muss, weil der die beiden Fälle nicht mehr unterscheiden muss und weil Code der mit den Endwerten arbeitet auch für ”Einzelwerte” funktioniert in dem man Start- und Endwert einfach gleich wählt.

Und dann gibt es das was Du suchst bereits fertig als Funktion im `itertools`-Modul.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Danke für die Hilfreichen Antworten. :)

Ich habe das nun so gelöst, dass ich den start und endwert mit abspeichere. Ich könnte auch ein Modul verwende, da dieses Projekt aber zum vorzeigen dient, möchte ich alles selber machen :) Aber danke für den Hinweis

MfG
Trayser
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

Alternativ kann man natürlich auch mit Indizierung tricksen:

Code: Alles auswählen

>>> import itertools
>>> ip = [[1, 12], [1, 168], [10], [15]]
>>> list(itertools.product(*(range(a[0], a[-1]+1) for a in ip))
Antworten