Pythonprog nur ausführbar machen, wenn Bedingung erfüllt?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

hab einfach shutils in mein installationspacket eingebaut und dann rmtree daraus importiert.
darf man doch, oder? ist ja non-kommerziell.
lunar

Hyperion hat geschrieben:Gabs da nicht mal die Macke einiger Windoof Editoren, bei utf-8 irgend welche komischen Header-Bytes avor zu setzen? Meine das hier schon mal gelesen zu haben ...
Nennt sich BOM (Byte-Order-Mark) und gehört eigentlich nicht an den Anfang von UTF-8-Dateien, was Windows-Editoren wie Notepad aber nicht daran hindert, sie doch zu schreiben ;)
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

mocca hat geschrieben:...bleibt nur noch das unlesbarmachen der pfadangaben.
Base64 wurde Dir doch schon vorgeschlagen.

Code: Alles auswählen

>>> 'TWVpbiBQZmFk'.decode('base64')
'Mein Pfad'
MfG
HWK
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

lunar hat geschrieben:Nennt sich BOM (Byte-Order-Mark) und gehört eigentlich nicht an den Anfang von UTF-8-Dateien, was Windows-Editoren wie Notepad aber nicht daran hindert, sie doch zu schreiben ;)
DIe exaktere Formulierung lautet:
Wikipedia hat geschrieben:While UTF-8 does not have byte order issues, a BOM encoded in UTF-8 may nonetheless be encountered, though the Unicode standard does not recommend using it
D.h. also UTF-8-BOM ist irgendwie schon gültig, nur eben eine schlechte Idee. Python kann mit dem ``utf-8-sig``-Codec automatisch solche BOMs verwerfen.

Und Base64 hilft ja auch nichts, spätestens wenn man ``strace`` verwendet, weiß man genau auf welche Dateien zugegeriffen wird. So Verschleierungsversuche funktionieren eben nicht Trundle hat in diesem Thread aus einer "kompilierten" Datei den Salt ausgelesen und damit die Absicherung überwunden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

könntet ihr mir nochmal was helfen?
ich wollte mehrere dateien überprüfen lassen statt nur einer mit diesem code

Code: Alles auswählen

if os.access(['/usr/Plugins/Extensions/nel', '/usr/local/Dark', '/bin/mmfe', '/usr/lib/ma2/python/', '/usr/lib/ma2/python/Plugins', '/usr/AF', '/usr/f.ttf', '/var/etc/.en.cfg' ], os.F_OK): print ""; print "prüfung erfolgreich"; print ""; 
dann kriege ich aber folgenden fehler:
TypeError: coercing to Unicode: need string or buffer, list found
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Dass Base64 u.ä. keine komplette Verschleierung ermöglichen, ist doch klar. Einen pfiffigen Hacker wird man sowieso nicht aufhalten können. Ich kann aber moccas Argumente nachvollziehen, dass er es Laien erschweren will, das Sytem zum Absturz zu bringen. Und dafür sollte Base64 doch reichen. :)
MfG
HWK
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Wie kommst du darauf, dass die access-Funktion eine Liste akzeptiert? Sie kann nur mir einzelnen Pfaden umgehen.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

@mocca: Die Verwendung von all und map hatte Dir doch bereits helduel gezeigt.
MfG
HWK
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

naja, ich "kam" nicht direkt drauf, dass es bei os.access geht, ich dachte nur, dass es vermutlich geht. wusste nur, dass man normalerweise so mehrere zu prüfende dateien angibt.

und sorry, ja, das mit all(map( hatte ich gesehen, aber nicht gewusst, dass das die korrekte vorgehensweise für meinen versuch gewesen wäre.

und man muss dann os.path.exists nehmen, richtig? denn wenn ich

Code: Alles auswählen

all(map(os.access(['deded', 'edwdewe'], F_OK))
nehme kriege ich trotzdem die list-fehlermeldung

Code: Alles auswählen

if all(map(os.path.exists, ['/usr/Plugins/Extensions/nel', '/usr/local/Dark', '/bin/mmfe', '/usr/lib/ma2/python/', '/usr/lib/ma2/python/Plugins', '/usr/AF', '/usr/f.ttf', '/var/etc/.en.cfg' ])): print ""; print "prüfung erfolgreich"; print ""; 


das funktioniert! hatte erst nen tippfehler in einer der files, deshalb hat er dann immer mit else weitergemacht.
peinlich. dreimal kontrolliert und doch was übersehen!
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

ein Pfad ist ein Pfad - egal ob Ordner oder Datei. Einfach mal ausprobieren. Ist ja dank Python-Interpreter einfach möglich.

Zu deinem all/map/access-Teil: Das kann so nicht funktionieren. Du übergibst die Liste der access-Funktion und nicht der map-Funktion (die soll ja damit was anstellen). Außerdem hast du das Problem, dass du der access-Funktion einen weiteren Parameter übergeben willst/musst. Da musst du ein klein wenig anders vorgehen. Z.B. so (ungetestet):

Code: Alles auswählen

all(map(lambda p: os.access(p, os.F_OK), ['deded', 'edwdewe']))
# oder aber
all([os.access(path, os.F_OK) for path in ['deded', 'edwdewe']])
Es gäbe da auch noch die Möglichkeit das via partial zu machen.

Gruß,
Manuel
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

also, ich habe es jetzt soweit, dass die kontrolle mehrerer dateien auf existenz funktioniert.

DANKE!!!!

nun fehlt noch der base64 teil.

das encoden und decoden ist kein problem. aber dies nun korrekt an den os.path.exist zu übergeben scheitert.

Code: Alles auswählen

encoded = base64.b64encode("'/usr/lib/nel'", altchars=None)
ku1 = base64.b64decode(encoded, altchars=None)
print ku1
encoded2 = base64.b64encode("'/usr/lib/module'", altchars=None)
ku2 = base64.b64decode(encoded2, altchars=None)
print ku2

if all(map(os.path.exists, [ku1, ku2])): print "vorhanden"
irgendwas stimmt auch hier nicht, weil jedesmal else ausgeführt wird :x

hab auch schon versucht nur einen pfad zu prüfen mit

Code: Alles auswählen

if all(map(os.path.exists, [ku1])): print "vorhanden"
und auch mit

Code: Alles auswählen

if all(map(os.path.exists, ku1)): print "vorhanden"
aber ging beides auch nicht.

ziel so nah und doch so fern.
wo isn jetzt schon wieder mein fehler? :oops:
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

versuchs nochmal ohne die doppelten Stringliterale:

Code: Alles auswählen

"'/usr/lib/nel'" --> '/usr/lib/nel'
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

:D :D :D :D :D

danke schön!

ich dachte ich bräuchte die, da sonst für die pfadangabe die einfachen nicht mit encoded und decoded würden.

vielen dank.

werd mal versuchen das ganze nun fertig zu stellen und dann nach dem essen berichten :)
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

so, allerletzte frage, dann ists fertig.

in meinem else ist es so, dass wenn eine der zu löschenden dateien fehlt, der rest nicht gelöscht wird, sprich der vorgang abgebrochen wird.

wie kann ich das am einfachsten verhinden bzw. dafür sorgen, dass das ignoriert und der nächste befehl ausgeführt wird?

Code: Alles auswählen

else: shutil.rmtree(ku11); os.remove(ku9); os.remove(ku10);
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

mocca hat geschrieben:in meinem else ist es so, dass wenn eine der zu löschenden dateien fehlt, der rest nicht gelöscht wird, sprich der vorgang abgebrochen wird.
indem du die doku zu den dir bereits bekannten funktionen liest.

Code: Alles auswählen

help("shutil.rmtree")
gibt u.a.

rmtree(path, ignore_errors=False, onerror=None)

zurück, ignore_errors fällt da ins Auge.

edit: die semicola sind hoffentlich nur im post un nicht in deinem code?
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

das problem is das os.remove().

dort gibt es, zumindest laut help, kein ignore_errors. und wenn ich es testweise einfüge kommt entsprechend ein fehler.
sobald aber das erste os.remove() eine datei löschen soll, die es nicht gibt, bricht der ganze vorgang ab.

so sieht der code bei mir aus:

Code: Alles auswählen

if all(map(os.path.exists, [ku1, ku2, ku3, ku4, ku5, ku6, ku7, ku8])):
	print ""
	print "All clear"
	print ""
	sys.exit(10)
else:
	os.remove(ku10)
	os.remove(ku9)
	shutil.rmtree(ku11, ignore_errors=True)
	print "SystemFailure"
	sys.exit(10)

EDIT: ich sollte noch erwähnen, dass mir bewusst ist, dass ich alles mit shutils löschen lassen könnte, da shutils aber nicht zum system gehört und von mir installiert wird, würde ich gerne eine systemfunktion zum löschen der wichtigsten beiden datei nutzen. muss also ein "os" befehl sein.
BlackJack

Die Namensgebung `ku1` bis `ku11` ist jetzt aber nicht ernst gemeint, oder? Namen sollten die Bedeutung des Objekts, das an sie gebunden ist widerspielgeln, und nicht den Leser verwirren.

Ein `os.remove()` bei einer Datei, die es nicht gibt, löst eine Ausnahme aus. Die musst Du entsprechend mit ``try`` und ``except`` behandeln.
mocca
User
Beiträge: 84
Registriert: Mittwoch 4. März 2009, 16:44

doch, ist mein ernst.
ist doch teil der absicherung.
wenn ich da hinschreibe: kontrolldatei1, kontrolldatei2, dann würde das der ganzen idee des verschlüsselns mit base64 widersprechen.

das mit try werde ich gleich mal versuchen :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mocca hat geschrieben:doch, ist mein ernst.
ist doch teil der absicherung.
OMG!
wenn ich da hinschreibe: kontrolldatei1, kontrolldatei2, dann würde das der ganzen idee des verschlüsselns mit base64 widersprechen.

das mit try werde ich gleich mal versuchen :)
Wobei ich das noch nicht ganz verstanden habe: Irgendwo im Script muss das ja passieren - diesen Teil kann man doch dann einfach auskommentieren?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Warum schreibst du nicht einfach eine ausführliche Readme und verschwendest deine Zeit und Energie nicht für irgendwelche komischen Maßnahmen, die den Code einfach nur unleserlich und unwartbar machen und dabei letztlich doch nichts bringen?

Edit: Typo.
Zuletzt geändert von Trundle am Donnerstag 5. März 2009, 21:55, insgesamt 1-mal geändert.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Antworten