Seite 1 von 2
Zugriffsrechte von Dateien: Änderungen vornehmen
Verfasst: Samstag 27. Oktober 2007, 16:53
von Markus12
Hallo zusammen,
ich habe mich mal wieder mit meinem Pythonbuch beschäftigt und mir ist wieder eines meiner Programme in die Hände gefallen. Es ist ein Programm, mit dem man die Zugriffsrechte von Dateien verändern kann.
Abgefragt werden Zugriffsrechte mit 'access' und geändert mit 'chmod' - Das steht hier geschrieben und funktioniert.
Um die Zugriffsrechte auf ein bestimmtes Niveau zu heben oder zu senken benutzt man Oktalzahlen, je nach Personengruppe:
Hier sind folgende aufgelistet:
1.Besitzer:
400 Lesen
200 Schreiben
100 Ausführen
2.Gruppe
40 Lesen
20 Schreiben
10 Ausführen
3.andere
4 Lesen
2 Schreiben
1 Ausführen
Jetzt habe ich einer Datei mittels 'access' einfach kurzerhand die Zugriffsrechte "NICHTS" gegeben, habe also als Modus, der verlangt wird, "0" eingegeben.
Allerdings habe ich nach dem Abfragen bemerkt, dass nur das Schreiberecht weggenommen wurde und Lese- sowie Ausführrecht weiterhin verfügbar sind.
Nun frage ich mich, warum das so ist? ^^
2. Frage:
Muss man diese Oktalzahlen addieren, wenn ich möchte, dass der Besitzer das Lese- und Schreiberecht haben soll? Demnach musste ich als Oktalzahl "0600" übergeben (0400 + 0200 - Liste oben), richtig?
Denn hier im Buch als Beispiel steht nur noch geschrieben, dass man die Oktalzahl "0777" übergeben soll, wenn alle Rechte gegeben sein sollen. Meiner Logik nach ist das so, weil 0400+0200+0100+040+020+010+04+02+01 = 0777 sind??!
Danke schonmal für eventuelle Antworten
Grüße Markus
Verfasst: Samstag 27. Oktober 2007, 19:06
von BlackJack
Du kannst mit `os.access()` keine Rechte vergeben, also auch keine wegnehmen. Die Funktion ist zum Testen was der (effektive) Benutzer machen darf und gibt `True` oder `False` zurück.
Aus Deiner Beschreibung werde ich absolut nicht schlau was genau Du gemacht hast.
2. Frage: Ja die Rechte werden addiert. Eigentlich bitweise Oder-Verknüpft, aber solange sich keine gesetzten Bits überschneiden ist das äquivalent zu einer Addition.
Verfasst: Sonntag 28. Oktober 2007, 11:58
von Markus12
Ja, habe ich gerade bemerkt, dass ich das verwechselt habe.. Oben hatte ich ja geschrieben...
Abgefragt werden Zugriffsrechte mit 'access' ...
Weiß es ja^^
Ok, addieren kann man sie. Das ist doch mal gut schonmal.
Ich habe mit 'chmod' einer Datei die Zugriffsrechte '0' gegeben, da ich dachte, dass dadurch die Datei keinerlei Rechte mehr hat!
Aber als ich sie wieder abgefragt habe, kam dabei raus, dass das Lese- sowie Ausführrecht trotzdem noch vorhanden sind, nur das Schreiberecht wurde weggenommen.
Und das verstehe ich nicht.
Verfasst: Sonntag 28. Oktober 2007, 12:06
von Leonidas
Wie machst du es? Hier funktioniert das einwandfrei.
Code: Alles auswählen
$ touch test
$ ls -l test
-rw-r--r-- 1 leonidas leonidas 0 28. Okt 12:02 test
$ python
Python 2.4.4 (#1, Oct 25 2007, 21:00:01)
[GCC 4.1.2 (Gentoo 4.1.2 p1.0.1)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.chmod('test', 0)
>>>
$ ls -l test
---------- 1 leonidas leonidas 0 28. Okt 12:02 test
Verfasst: Sonntag 28. Oktober 2007, 12:16
von Markus12
...
Ja, das changen der Rechte funzt ja, aber wenn man sie daraufhin wieder abfragt, dann habe ich bemerkt, dass nur das Schreiberecht nicht mehr da ist!
Ich probiere es gleich noch einmal:
Code: Alles auswählen
>>> chmod(r'C:\Dokumente und Einstellungen\Markus Naumann\Desktop\a\Neu Microsoft Word-Dokument.doc', 0)
>>> access(r'C:\Dokumente und Einstellungen\Markus Naumann\Desktop\a\Neu Microsoft Word-Dokument.doc', R_OK)
True
>>> access(r'C:\Dokumente und Einstellungen\Markus Naumann\Desktop\a\Neu Microsoft Word-Dokument.doc', W_OK)
False
>>> access(r'C:\Dokumente und Einstellungen\Markus Naumann\Desktop\a\Neu Microsoft Word-Dokument.doc', X_OK)
True
>>> #Hier seht ihr, dass ich zwar die Rechte alle weggenommen habe (Zeile 1), aber immer noch zwei von drei Rechten verfügbar sind!
>>>
Jetzt denke ich wisst ihr, was ich meine ;D
Verfasst: Sonntag 28. Oktober 2007, 12:31
von Leonidas
Dokumentation lesen hilft:
http://docs.python.org/lib/os-file-dir.html#l2h-2677 hat geschrieben:Note: Although Windows supports chmod(), you can only set the file's read-only flag with it (via the S_IWRITE and S_IREAD constants or a corresponding integer value). All other bits are ignored.
Apropos, hast du etwa ``os`` mit ``from os import *`` geladen? Dann manch dich auf ganz seltsame Fehlfunktionen gefasst.
Verfasst: Sonntag 28. Oktober 2007, 12:40
von Markus12
Ja, habe ich^^
Was für Fehlfunktionen können denn auftreten??
Meinst du zum Beispiel die Funktion, mit der man Exe-Files ausführen kann, aber bei der Argumentenübergabe ein " mehr machen muss?! ^^
Die kenn ich, habe sie aber gerade vergessen -.-
Verfasst: Sonntag 28. Oktober 2007, 12:50
von Leonidas
Markus12 hat geschrieben:Ja, habe ich^^
Was für Fehlfunktionen können denn auftreten??
Du kannst Dateien nicht mehr öffnen, weil du das Builtin ``open()`` mit ``os.open()`` überschrieben hast.
Also vergiss einfach dass es den Stern-Import gibt. Er erzeugt mehr Arbeit, als dass er Zeit spart.
Markus12 hat geschrieben:Meinst du zum Beispiel die Funktion, mit der man Exe-Files ausführen kann, aber bei der Argumentenübergabe ein " mehr machen muss?! ^^
Quatsch. ``subprocess`` funktioniert immer und quotet auch selbst.
Verfasst: Sonntag 28. Oktober 2007, 13:31
von gerold
Hallo Markus12!
Unter Windows läuft einiges ein wenig komplizierter ab.
Mit ``win32api.SetFileAttributes`` kannst du Attribute wie z.B. "ReadOnly" oder "Hidden" vergeben.
Und mit ``win32security.SetFileSecurity`` kannst du
Berechtigungen vergeben. Das ist aber ziemlich kompliziert.
Ich schau mal ob ich etwas finde, mit dem es einfacher wird...
mfg
Gerold

Verfasst: Sonntag 28. Oktober 2007, 13:50
von gerold
gerold hat geschrieben:Ich schau mal ob ich etwas finde, mit dem es einfacher wird...
Hallo!
Du kannst z.B. mit dem Kommandozeilenprogramm "cacls" arbeiten. Dieses kannst du unter Python sehr einfach über subprocess aufrufen.
Code: Alles auswählen
J:\Dokumente und Einstellungen\Gerold>cacls /?
Ändert Datei-ACLs (Access Control List) oder zeigt sie an.
CACLS Dateiname [/T] [/E] [/C] [/G Benutzer:Zugriff] [/R Benutzer [...]]
[/P Benutzer:Zugriff [...]] [/D Benutzer [...]]
Dateiname ACLs für angegebene Datei anzeigen.
/T ACLs der angegebenen Datei im aktuellen Verzeichnis
und allen Unterverzeichnissen ändern.
/E ACL bearbeiten anstatt sie zu ersetzen.
/C Ändern der ACLs bei Zugriffsverletzung fortsetzen.
/G Benutzer:Zugriff Angegebene Zugriffsarten zulassen.
Zugriff kann sein: R Lesen
W Schreiben
C Ändern (Schreiben)
F Vollzugriff
/R Benutzer Zugriffsrechte des Benutzers aufheben (gültig mit /E).
/P Benutzer:Zugriff Zugriffsrechte des Benutzers ersetzen.
Zugriff kann sein: N Kein
R Lesen
W Schreiben
C Ändern (Schreiben)
F Vollzugriff
/D Benutzer Zugriff für Benutzer verweigern.
Platzhalterzeichen (Wildcards) werden für "Dateiname" unterstützt.
Mehrere Benutzer können in einem Befehl angegeben werden.
Abkürzungen:
CI - Containervererbung.
Der ACE-Eintrag wird von Verzeichnissen geerbt.
OI - Objektvererbung.
Der ACE-Eintrag wird von Dateien geerbt.
IO - Nur vererben.
Der ACE-Eintrag bezieht sich nicht auf
die aktuelle Datei/das aktuelle Verzeichnis.
Und hier habe ich noch ein kleines Beispiel für win32security gefunden:
http://mail.python.org/pipermail/python ... 02111.html
mfg
Gerold

Verfasst: Sonntag 28. Oktober 2007, 14:36
von Markus12
Quatsch. ``subprocess`` funktioniert immer und quotet auch selbst.
das ist mir schon klar. Von welchem Modul sprechen wir nochmal gerade?! VON OS LOL ^^
Ich habe im Web geschaut und wieder die Funktion gefunden:
os.system(argument)
@Gerold:
Danke, ich werde das gleich mal ausprobieren ;D
Verfasst: Sonntag 28. Oktober 2007, 14:53
von Markus12
So, und den Fehler habe ich jetzt auch wiedergefunden bei os.system.
Auf der
Seite steht es unter anderem, aber ich zitiere an dieser Stelle mal:
Code: Alles auswählen
editorstring='""%s" "%s"'% (ImageEditorPath,saveas)
#Notice the first leading " above? This is the bug in python that no one will admit...
os.system(editorstring)
Anders kann man es nicht machen. Diesen Bug finde ich extrem lästig -.-
Verfasst: Sonntag 28. Oktober 2007, 15:02
von gerold
Markus12 hat geschrieben:Quatsch. ``subprocess`` funktioniert immer und quotet auch selbst.
das ist mir schon klar. Von welchem Modul sprechen wir nochmal gerade?! VON OS LOL ^^
Hallo Markus12!
subprocess ist ein Modul und tritt die Nachfolge von os.popen os.exec und os.system an. Suche einfach mal in der Hilfe danach. An subprocess.Popen oder subprocess.call wird einfach eine **Liste** mit Argumenten übergeben, die automatisch korrekt gequoted wird.
mfg
Gerold

Verfasst: Sonntag 28. Oktober 2007, 15:07
von Markus12
Was meinst du mit "quoten"?

Verfasst: Sonntag 28. Oktober 2007, 15:09
von Leonidas
Markus12 hat geschrieben:das ist mir schon klar. Von welchem Modul sprechen wir nochmal gerade?! VON OS LOL ^^
und wer nutzt ``os.system()`` noch? Meist Code der vor ``subprocess`` da war und Leute die von ``subprocess`` noch nichts mitbekommen haben. (Sollte ich nun auch mit "LOL" antworten oder würde ich dann dämlich klingen?)
Markus12 hat geschrieben:So, und den Fehler habe ich jetzt auch wiedergefunden bei os.system.
Auf der
Seite steht es unter anderem, aber ich zitiere an dieser Stelle mal:
Code: Alles auswählen
editorstring='""%s" "%s"'% (ImageEditorPath,saveas)
#Notice the first leading " above? This is the bug in python that no one will admit...
os.system(editorstring)
Das ist kein Python-Bug, zumindest konnte ich ihn unter Linux nicht mit Python 2.4.4 nachvollziehen (Können das Leute mit Windows mal testen?), da beschwert sich die Shell (zu recht) über die überflüssigen Apostrophe.
Das ist höchstens ein Code von jemandem, der nicht weiß, dass ``subprocess`` sich automatisch um das Quoten kümmert.
Verfasst: Sonntag 28. Oktober 2007, 15:12
von Leonidas
Markus12 hat geschrieben:Was meinst du mit "quoten"?

"Quoten" heißt, dass Der Ausdruck richtig in Apostrophe gesetzt wird, damit das System erkennen kann, mit welchen Kommandozeilenparametern ein Programm gestartet werden kann.
Beispiel: ich will eine Datei löschen:
Code: Alles auswählen
$ rm das ist die datei
$ # so, nun worden die Dateien "das" "ist" "die" "datei" gelöscht,
$ # "das ist die datei" ist aber immer noch da
$ # also quoten
$ rm 'das ist die datei'
$ # nun ist sie weg
Verfasst: Sonntag 28. Oktober 2007, 15:20
von Markus12
Wer noch os.system nutzt ist doch egal. Ich mache es!
Diesen satz bitte nochmal übersetzen:
Meist Code der vor ``subprocess`` da war und Leute die von ``subprocess`` noch nichts mitbekommen haben.
Den habe ich überhaupt nicht verstanden.
Sollte ich nun auch mit "LOL" antworten oder würde ich dann dämlich klingen?
Heißt das, dass ich dämlich klinge?? Danke schön :@
Dieser Bug ist scheinbar wirklich einer, denn unter Windows (welches ich benutze) geht es nicht ohne das ".
ok, das mit dem quoten ist verstanden ;D
Verfasst: Sonntag 28. Oktober 2007, 15:26
von Leonidas
Markus12 hat geschrieben:Wer noch os.system nutzt ist doch egal. Ich mache es!
Diesen satz bitte nochmal übersetzen:
Meist Code der vor ``subprocess`` da war und Leute die von ``subprocess`` noch nichts mitbekommen haben.
Den habe ich überhaupt nicht verstanden.
Auf ein neues: "Der meiste Code der ``os.system()`` nutzt wurde entweder geschrieben, als es noch keine ``subprocess`` gab oder von Leuten die sich der großen Vorteile von ``subprocess`` gegenüber ``os.system()`` nicht bewusst waren."
Nun verständlicher?
Sollte ich nun auch mit "LOL" antworten oder würde ich dann dämlich klingen?
Markus12 hat geschrieben:Dieser Bug ist scheinbar wirklich einer, denn unter Windows (welches ich benutze) geht es nicht ohne das ".
Welche Python und Windows-Version nutzt du? Ich könnte mir seit dem ``mailto:``-Bug in Windows vorstellen, dass auch das irgendwie in Windows fehlerhaft ist.
Verfasst: Sonntag 28. Oktober 2007, 15:37
von Markus12
Ich benutze die Windows Version:
Windows XP
Media Center Edition
Version 2002
Service Pack 2
Und Python 2.5...
Verfasst: Montag 29. Oktober 2007, 16:54
von Markus12
Ja, was ich jetzt auch bemerkt habe, ist, dass wenn ich überprüfen möchte, ob ein Pfad eine Datei oder ein Ordner ist, es Schwierigkeiten mit Variablennamen geben kann!
Code: Alles auswählen
from os import*
path='/projekt/MeinProgramm.py'
if path.isfile(path):
pass
Das '
path.isfile(..)' gibt es hier Probleme, da es hier ebenso eine Variable gibt, die so heißt -.- Ok, aber jetzt benutze ich
Danke für den Tipp.