Doppelte IP Adressen auffinden, anzeigen und ggf. ändern

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
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: 18270
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? ^^
BlackJack

@nomnom: Je nach dem wie die Adressmaske aussieht, möchte man 255 aber sicher nicht verwenden. :-)
Antworten