Doppelte IP Adressen auffinden, anzeigen und ggf. ändern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
BlackJack

@TrayserCassa: Das mit dem ``except:`` hat nichts damit zu tun ob Du den Code testest oder nicht. Das ist ein Problem wenn Ausnahmen auftreten mit denen Du nicht gerechnet hast, also auch nicht beim Testen, denn wenn Du damit gerechnet hättest, dann hättest Du dafür ja einen Test durchgeführt. Und wenn Du keine Unit-Tests hast, dann müsstest Du manuell nach jeder Programmänderung die Tests für die geänderte Stelle manuell machen. Und zwar jedes mal die selben. So aus dem Kopf.

Du musst die Bedingung für das ``continue`` nur umdrehen. Also nicht gehe zum Anfang wenn etwas nicht stimmt, sondern mache dieses hier *wenn* alles stimmt. Zu einer Ausnahmebehandlung gehört ein ``try`` und dann gibt es noch ``except``, ``finally``, und ``else``. Ein ``else``-Block wird ausgeführt, wenn im ``try``-Block *keine* Ausnahme aufgetreten ist. Du solltest neben Deinem Buch eventuell auch mal einen Blick in die Python-Dokumentation werfen. Erwarte nicht, dass in einem Buch wirklich alles vorkommt, was eine Programmiersprache an Syntax bietet. Und auch nicht alle Methoden auf Grunddatentypen. `is_decimal()` ist wie gesagt eine Methode auf Zeichenketten. Da braucht man kein Modul für und mit den Methoden die Zeichenketten bieten, sollte man sich auseinandersetzen. Das sind Grundlagen. Und auch da würde ich nicht erwarten, dass die alle in einem Buch einzeln besprochen werden. Die Python-Dokumentation ist wichtig, für das praktische Arbeiten am Ende wichtiger als ein Lehrbuch.

Das Ergebnis des Tests ist das selbe, allerdings wesentlich einfacher und mit deutlich weniger Quelltext den man verstehen muss. Statt ``try``/``except``/``else`` ist es einfach nur ein ``if`` und dieser Methodenaufruf.

Beim `subprocess.call()` bitte das ``shell=True`` weg lassen. Sonst handelt man sich die gleichen Probleme ein, die `os.system()` hat.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

@TrayserCassa: Das mit dem ``except:`` hat nichts damit zu tun ob Du den Code testest oder nicht. Das ist ein Problem wenn Ausnahmen auftreten mit denen Du nicht gerechnet hast, also auch nicht beim Testen, denn wenn Du damit gerechnet hättest, dann hättest Du dafür ja einen Test durchgeführt. Und wenn Du keine Unit-Tests hast, dann müsstest Du manuell nach jeder Programmänderung die Tests für die geänderte Stelle manuell machen. Und zwar jedes mal die selben. So aus dem Kopf.
In diesem Fall wird Try verwendet um zu testen ob das eine zahl ist. Wenn nicht dann neue eingabe ... Wenn ich jetzt was anderes als eine Zahl von 1 bis 255 eingebe, dann soll der den Ping ja nicht ausführen weil das unnötige Arbeit ist. Bei einem Fehler geh nach except und da wird dann gesagt wieder von neuen anfangen. :K Was ist daran falsch?
Du musst die Bedingung für das ``continue`` nur umdrehen. Also nicht gehe zum Anfang wenn etwas nicht stimmt, sondern mache dieses hier *wenn* alles stimmt. Zu einer Ausnahmebehandlung gehört ein ``try`` und dann gibt es noch ``except``, ``finally``, und ``else``. Ein ``else``-Block wird ausgeführt, wenn im ``try``-Block *keine* Ausnahme aufgetreten ist. Du solltest neben Deinem Buch eventuell auch mal einen Blick in die Python-Dokumentation werfen. Erwarte nicht, dass in einem Buch wirklich alles vorkommt, was eine Programmiersprache an Syntax bietet. Und auch nicht alle Methoden auf Grunddatentypen. `is_decimal()` ist wie gesagt eine Methode auf Zeichenketten. Da braucht man kein Modul für und mit den Methoden die Zeichenketten bieten, sollte man sich auseinandersetzen. Das sind Grundlagen. Und auch da würde ich nicht erwarten, dass die alle in einem Buch einzeln besprochen werden. Die Python-Dokumentation ist wichtig, für das praktische Arbeiten am Ende wichtiger als ein Lehrbuch.
Ok danke für den Tipp :)
Das Ergebnis des Tests ist das selbe, allerdings wesentlich einfacher und mit deutlich weniger Quelltext den man verstehen muss. Statt ``try``/``except``/``else`` ist es einfach nur ein ``if`` und dieser Methodenaufruf.
Stimmt nur trenne ich gerne generell Erfolg und Misserfolg voneinander und eine reine if verzweigung finde ich nicht wirklich übersichtlicher, aber dennoch im Bereich des Möglichen ;)
Beim `subprocess.call()` bitte das ``shell=True`` weg lassen. Sonst handelt man sich die gleichen Probleme ein, die `os.system()` hat.
Dadurch würde die shell wieder zum vorschein kommen und da liegt mein Problem...

ok soweit zum Coden jetzt nur meine Frage noch wie ich netsh als Admin ausführe ...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Und ist schon klar, warum du ein try/except verwendest. Du verwendest es allerdings falsch, da bei dir alle Fehler abgefangen werden, auch wenn diese gar nichts mit der Umwandlung der Zahl zu tun haben. Damit verdeckst du unter Umständen Programmierfehler, welche dann auch noch schwer zu finden sind, weil du falsche Meldungen bekommst und, im schlimmsten Fall, sich das Programm in einem inkonsistenten Zustand befindet und dann an einer Stelle abstürzt, die mit dem eigentlichen Fehler nichts zu tun hat. Mal als Beispiel:

Code: Alles auswählen

>>> try:
...     input("Zahl eingeben: ")
...     hier_wird_eine_name_error_geworfen *= 2
... except:
...     print("Es wurde keine Zahl eingegeben")
... 
Zahl eingeben: 42
42
Es wurde keine Zahl eingegeben

Code: Alles auswählen

>>> try:
...     input("Zahl eingeben: ")
...     hier_wird_eine_name_error_geworfen *= 2
... except ValueError:
...     print("Es wurde keine Zahl eingegeben")
... 
Zahl eingeben: 42
42
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
NameError: name 'hier_wird_eine_name_error_geworfen' is not defined
In beiden Beispielen wird die Variable "hier_wird_eine_name_error_geworfen" verwendet, obwohl sie vorher nie angelegt wurde. Wenn du einfach alle Fehler abfängst, so wie du es im Moment macht, dann endet das ganze wie im oberen Beispiel. Der Benutzer gibt die Zahl korrekt ein, in der nächsten Zeile hast du in deinem Programm allerdings einen Fehler gemacht. Die Exception wird abgefangen und es wird einfach behauptet, dass die Eingabe falsch war. Im zweiten Fall hingegen gibt es die korrekte Fehlermeldung.
Das Leben ist wie ein Tennisball.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

EyDu hat geschrieben:Und ist schon klar, warum du ein try/except verwendest. Du verwendest es allerdings falsch, da bei dir alle Fehler abgefangen werden, auch wenn diese gar nichts mit der Umwandlung der Zahl zu tun haben. Damit verdeckst du unter Umständen Programmierfehler, welche dann auch noch schwer zu finden sind, weil du falsche Meldungen bekommst und, im schlimmsten Fall, sich das Programm in einem inkonsistenten Zustand befindet und dann an einer Stelle abstürzt, die mit dem eigentlichen Fehler nichts zu tun hat. Mal als Beispiel:

Code: Alles auswählen

>>> try:
...     input("Zahl eingeben: ")
...     hier_wird_eine_name_error_geworfen *= 2
... except:
...     print("Es wurde keine Zahl eingegeben")
... 
Zahl eingeben: 42
42
Es wurde keine Zahl eingegeben

Code: Alles auswählen

>>> try:
...     input("Zahl eingeben: ")
...     hier_wird_eine_name_error_geworfen *= 2
... except ValueError:
...     print("Es wurde keine Zahl eingegeben")
... 
Zahl eingeben: 42
42
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
NameError: name 'hier_wird_eine_name_error_geworfen' is not defined
In beiden Beispielen wird die Variable "hier_wird_eine_name_error_geworfen" verwendet, obwohl sie vorher nie angelegt wurde. Wenn du einfach alle Fehler abfängst, so wie du es im Moment macht, dann endet das ganze wie im oberen Beispiel. Der Benutzer gibt die Zahl korrekt ein, in der nächsten Zeile hast du in deinem Programm allerdings einen Fehler gemacht. Die Exception wird abgefangen und es wird einfach behauptet, dass die Eingabe falsch war. Im zweiten Fall hingegen gibt es die korrekte Fehlermeldung.
Ahhh ok hat Klick gemacht :) bloß wo liegt der fehler wenn ich nur eine Zeile in einem Try Zweig habe ;) Aber Ich weiß worauf Ihr beide hinaus wollt ;) Danke für die Tipp's und vorallem um die Bemühungen :mrgreen:

mfg
Trayser
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Auch in einer Zeile kann man problemlos Fehler einbauen. Oder eine Zeile ändert sich mal. Gerne werden aus einer Zeile auch mal zwei, oder drei, oder mehr. Dann übersieht man leicht, dass irgendwo noch etwas angepasst werden muss und schon hat man einen richtigen Fehler.

Behandle also nur das, was du auch wirklich behandeln kannst. Wenn dir dein Programm dann um die Ohren fliegt, dann hast du immerhin die Chance den Fehler zu beseitigen.
Das Leben ist wie ein Tennisball.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

EyDu hat geschrieben:Auch in einer Zeile kann man problemlos Fehler einbauen. Oder eine Zeile ändert sich mal. Gerne werden aus einer Zeile auch mal zwei, oder drei, oder mehr. Dann übersieht man leicht, dass irgendwo noch etwas angepasst werden muss und schon hat man einen richtigen Fehler.

Behandle also nur das, was du auch wirklich behandeln kannst. Wenn dir dein Programm dann um die Ohren fliegt, dann hast du immerhin die Chance den Fehler zu beseitigen.
Jop habs getestet :mrgreen:
Hab mal bei der int(ip_eingabe) die Falsche Variabel gesetzt =) Danke für den Hinweiß ;)
BlackJack

@TrayserCassa: Wo ein Fehler liegt wenn man nur eine Zeile im ``try``-Block stehen hat, ist auch nicht so einfach zu beantworten wenn diese eine Zeile aus einem Funktionsaufruf besteht. Denn diese Funktion kann ja viele Zeilen haben, und da können ja auch Fehler drin sein. Und sie kann ihrerseits wieder Funktionen aufrufen. Die auch wieder Fehler haben können. Und so weiter.

Mit dem ``continue`` hast Du Erfolg und Misserfolg doch in der Struktur des Quelltextes auch nicht getrennt. Und bei einem ``if`` hättest Du dann im Misserfolgsfall ein ``else`` in dem nichts drin stehen würde. Oder Du gibst dort die Meldung aus, dass es keine Zahl war. Auf jeden Fall ist auch ein ``if``/``else`` hier einfacher als ein ``try``/``except``/``else``.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

BlackJack hat geschrieben:@TrayserCassa: Wo ein Fehler liegt wenn man nur eine Zeile im ``try``-Block stehen hat, ist auch nicht so einfach zu beantworten wenn diese eine Zeile aus einem Funktionsaufruf besteht. Denn diese Funktion kann ja viele Zeilen haben, und da können ja auch Fehler drin sein. Und sie kann ihrerseits wieder Funktionen aufrufen. Die auch wieder Fehler haben können. Und so weiter.
Stimmt auch wieder :oops:
Mit dem ``continue`` hast Du Erfolg und Misserfolg doch in der Struktur des Quelltextes auch nicht getrennt. Und bei einem ``if`` hättest Du dann im Misserfolgsfall ein ``else`` in dem nichts drin stehen würde. Oder Du gibst dort die Meldung aus, dass es keine Zahl war. Auf jeden Fall ist auch ein ``if``/``else`` hier einfacher als ein ``try``/``except``/``else``.
Ok stimmt nur frag ich dann ab ob die Zahl umgewandelt wurde nur fällt mir dazu der vergleich nicht ein...
if int(ip_eingabe) == ip_eingabe:
Weiter ....
ok Klappt dann der else zweig hinten dran ... ok kapiert :D

dankeschön für euer Verständnis :mrgreen:
mfg
Trayser
BlackJack

@TrayserCassa: Das wird aus zwei Gründen nicht funktionieren: Eine Zahl ist immer ungleich einer Zeichenkette, und wenn die Eingabe keine Zahl ist, dann wird beim Versuch sie umzuwandeln eine Ausnahme ausgelöst. Die Methode heisst `is_decimal()` und ist auf Zeichenketten zu finden.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Du könntest dir einige Zeit sparen, wenn jeder user im Netzwerk eine fest IP bekommt.

Code: Alles auswählen

IP = "192.168.0."
IPAdressen= []

for i in range(1, 50):
    nIP = IP + str(i)
    IPAdressen.append(nIP)
Wenn alle miteinander verbunden sind, sollte es keine große Aufgabe darstellen, jedem eine IP zuzusenden.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

@TrayserCassa: Das wird aus zwei Gründen nicht funktionieren: Eine Zahl ist immer ungleich einer Zeichenkette, und wenn die Eingabe keine Zahl ist, dann wird beim Versuch sie umzuwandeln eine Ausnahme ausgelöst. Die Methode heisst `is_decimal()` und ist auf Zeichenketten zu finden.
Naja wenn man eine Zahl eingibt Funktionierts allerdings bei falscher Eingabe ValueError ...

Das geht wieder über mein Wissen hinaus ;) Klar ich kann googel anschmeißen oder in der Dokomentation rein schnuppern, aber bei diesem Buch haben die das nichts anders gemacht ;) Für dich ist das leicht und verständlich ich bin grade mal bei der hälfte des Buches und will einfach mal was auf die Beine stellen...
Du könntest dir einige Zeit sparen, wenn jeder user im Netzwerk eine fest IP bekommt.

Code:

Code: Alles auswählen

IP = "192.168.0."
IPAdressen= []

for i in range(1, 50):
    nIP = IP + str(i)
    IPAdressen.append(nIP)

Wenn alle miteinander verbunden sind, sollte es keine große Aufgabe darstellen, jedem eine IP zuzusenden.
Ich könnte auch jedem die Wahl lassen ... Wie schon erwähnt es gibt zich verbesserungsvorschläge und wenn ich bei dem Buch bei tkinter angelangt bin schreib ich noch eine schöne Gui, aber fürs erste sollte man seine IP selber eingeben dürfen ;) Aber danke trotzdem, demnächst bau ich dann eine Abfrage rein ob Zufallsgenerriert oder selbsteingabe ;)

Naja und da ich jetzt noch kein Hinweiß darauf bekommen hab ist cx_Freeze für Python 3.2 und 3.3 ein Code zu Exe converter ;)
Nur blöde das der nicht bei mir funktioniert ... Hat jemand noch eine andere Lösung wie man Adminrechte bei einem subprocess bekommt? :cry:


mfg
Trayser
BlackJack

@TrayserCassa: Es funktioniert auch nicht wenn man eine Zahl eingibt, weil wie gesagt ein Wert vom Typ ganzer Zahl immer ungleich einem Wert vom Zeichenkette ist.

Und das geht auch nicht über Dein Wissen hinaus. Du weisst jetzt ja das es diese Methode gibt und wo man nachlesen kann was es noch für Methoden auf Zeichenketten gibt. Etwas auf die Beine stellen wollen, aber nicht in der Dokumentation nachlesen wollen was es für Möglichkeiten gibt, widerspricht sich irgendwie.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Ok sagen wir es so mein Programm funktioniert soweit. Jetzt möchte ich erst das mit dem netsh hin bekommen bevor ich den Code wieder ändere ;) Da ich zurzeit wieder wenig Zeit habe wird das wohl eben dauern ... danach setzte ich dein Vorschlag um und prässentiere den Code hier ;)
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Ok weiß keiner die Antwort?? Ich meine sowas muss doch schon häufiger aufgetreten sein?

Wenn man den Code ausführt:

Code: Alles auswählen


import subprocess
netsh = "netsh interface ip set address name=LAN-Verbindung source=static addr=192.168.0.20 mask=255.255.255.0"
subprocess.call(netsh)
input("Bitte Drücken sie eine Taste zum Benden.")

Zitat von cmd: "Für den angeforderten Vorgang sind erhöhte Rechte erfoderlich <Als Administrator ausführen>"

Mit dem Modul Socket komm ich auch nicht weiter :(
Kann mir bitte jemand helfen? :cry:

mfg
Trayser
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Fehlermeldung ist doch eindeutig: du hast nicht die benötigten Rechte, um netsh starten zu können. Die Suchmaschine deiner Wahl kann hier sicher weiterhelfen, wie du ein Programm mit Adminstratorrechten startest oder eine Konsole mit entsprechenden Rechten bekommst.
Das Leben ist wie ein Tennisball.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Natürlich weiß ich wo das Problem liegt und ich weiß sogar gleich Lösungen für mein Problem...

1. py2exe converter ---> Nur blöd das der nicht für Code aus Python3.2 gedacht ist.
2. cx_Freeze converter ---> Der Funktioniert bei mir leider nicht (Installation schlägt fehl).
3. subprocess mit runas ---> Erst heute um 10 Uhr gefunden in diesem Forum. (*klick*

ok soviel dazu....

Versteh mich bitte nicht falsch. Ich bin eigentlich selten Verzweifelt und suche natürlich auch in Google nach meinen Problemen (Dadurch bin ich ja erst auf dieses Forum aufmerksam geworden). Ich wusste schon vorher dass runas Admin rechte benötigt ...
Das erste was ich tat: rechtsklick auf das Script "Als Admini ausführen", leider nicht angegeben. Danach gegooglet und bin mit erfolg auf dem beitrag, den ich oben erwähnt hatte, gestoßen. Converter cx_Freeze versucht zu installieren...

-gegooglet warum der Converter nicht funktioniert.
-gegooglet nach alternativen

Danach habe ich mein Beitrag verfasst und als EyDu geantwortet hatte, habe ich weiter gesucht und gesucht und ...
Jedenfalls bin ich auf subprocess, in verbindung mit runas heute abend um 10 Uhr, gestoßen. Habs auch versucht bis 1.30 Uhr, aber hab dann aufgegeben ... das sah dann so aus:

Code: Alles auswählen

import subprocess
import os

net = " \"netsh interface ip set address name=LAN-Verbindung source=static addr=192.168.0.152 mask=255.255.255.0\""
subprocess.call(["runas", " /user:" + os.getlogin() + net])

Batch:

Code: Alles auswählen

runas /user:Patrick "netsh interface ip set address name=LAN-Verbindung source=static addr=192.168.0.22 mask=255.255.255.0"
Ich hab das wenigstens mit os.system() zum laufen gebracht:

Code: Alles auswählen

import os

net = " \"netsh interface ip set address name=LAN-Verbindung source=static addr=192.168.0.152 mask=255.255.255.0\""
os.system("runas /user:" + os.getlogin() + net)
Ich frage mich die ganze Zeit was bei subprocess falsch ist ... Und da Ich den Code ja noch für andere bereitstellen will, wird blackjack mir gleich sagen das ich os.system() vergessen soll. :mrgreen:

Ich erwarte auch keine Hilfe, vielleicht ein bisschen Verständnis für ein Neuling.
Ich bitte vielmehr um Hilfe und die behauptung ich würde keine Lösung suchen ist schlicht:

Code: Alles auswählen

False
mfg
Trayser
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@TrayserCassa: bei subprocess muss jedes Argument ein eigener Listeneintrag sein.
Bei Deinem ersten Versuch rufst Du also in Wirklichkeit

Code: Alles auswählen

runas " /user:Patrick \"netsh interface ip set address name=LAN-Verbindung source=static addr=192.168.0.22 mask=255.255.255.0\""
auf, wenn also »runas« mit dem Leerzeichen vor »/« zurechtkommt, denkt es der User würde »Patrick "netsh …« heißen.
Die »"« sind nur dazu da, Argumente, die Leerzeichen enthalten zusammenzuhalten, da die Abtrennung hier aber durch die Liste vorgegeben sind, sind sie überflüssig.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

@TrayserCassa: bei subprocess muss jedes Argument ein eigener Listeneintrag sein.
Bei Deinem ersten Versuch rufst Du also in Wirklichkeit

Code: Alles auswählen

runas " /user:Patrick \"netsh interface ip set address name=LAN-Verbindung source=static addr=192.168.0.22 mask=255.255.255.0\""
auf, wenn also »runas« mit dem Leerzeichen vor »/« zurechtkommt, denkt es der User würde »Patrick "netsh …« heißen.
Die »"« sind nur dazu da, Argumente, die Leerzeichen enthalten zusammenzuhalten, da die Abtrennung hier aber durch die Liste vorgegeben sind, sind sie überflüssig.
Oh ok habs:

Code: Alles auswählen

net = "netsh interface ip set address name=LAN-Verbindung source=static addr=192.168.0.152 mask=255.255.255.0"
subprocess.call(["runas", "/user:" + os.getlogin(), net])
Ich hab grade kein Lan kabel, aber von der cmd wird ein kleines Fenster aufgerufen, wird also wohl richtig sein :D
Herzlichen Dank :wink:

mfg
Trayser
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Ein Paar probleme bleiben aber noch, wie zb den check ob die IP addresse geändert wird...
Fals ich den passenden befehl finde ändere ich den Code ;)

Code: Alles auswählen


# Lokale IP setzter
# Made by Zonker

import subprocess
import os
import sys

# IP check und eingabe
anzahl = 0
while True:
    ip_eingabe = input("Geben sie Ihre gewünschte locale IP an: 192.168.0.")
    print()
    ip = "192.168.0." + ip_eingabe
    ip_isdecimal = ip_eingabe.isdecimal()
    if ip_isdecimal == True:
        if int(ip_eingabe) < 255 and int(ip_eingabe) > 0:
            check = subprocess.call(["ping", ip])
            if check == 1:
                print("IP bereits vergeben!")
                print()
                anzahl = anzahl + 1
                if anzahl > 2:
                    sys.exit("Vorgang abgebrochen!")
                elif check == 0:
                    print("IP ist frei!")
                    break
            else:
                print("Fehler")    
                print()
        else:
            print("Geben Sie eine Zahl von 1 bis 254 ein!")
    else:
        print("Geben Sie eine Zahl ein!")
        
print()

# IP änderung
net = "netsh interface ip set address name=LAN-Verbindung source=static addr=" + ip + " mask=255.255.255.0"
check = subprocess.call(["runas", "/user:" + os.getlogin(), net])

if check == 0:
    print()
    print("**************************************")
    print("      IP erfolgreich geändert")
    print("         IP:", ip)
    print("**************************************")
    print()
elif check == 1:
    print("Fehler! Administrator rechte verfügbar?")
else:
    print("Fehler")

Vielen Dank für eure hilfe :)

mfg
Trayser
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Das hilft vielleicht nicht unbedingt bei deinem Problem, aber IP-Adressblöcke können auch den Wert 0 oder 255 haben, wie Du ja auch in Deinem Code zeigst. Von daher wäre diese Überprüfung besser:

Code: Alles auswählen

if 0 <= int(ip_eingabe) <= 255:
Außerdem statt isdecimal() ginge auch das:

Code: Alles auswählen

try:
    ip_eingabe = int(input())
except ValueError:
    print("Bitte gib eine Zahl ein", file=sys.stderr)
    continue
Ansonsten frage ich mich, warum du „runas“ als den Benutzer, der das Skript ausführt, ausführst …? Oder verstehe ich runas nicht? ^^
Antworten