Zugriffsrechte von Dateien: Änderungen vornehmen

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.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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 :D

Grüße Markus
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.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

...

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
Zuletzt geändert von Leonidas am Sonntag 28. Oktober 2007, 12:51, insgesamt 1-mal geändert.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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 -.-
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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 -.-
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Was meinst du mit "quoten"? :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Markus12 hat geschrieben:Was meinst du mit "quoten"? :D
"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
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

Ich benutze die Windows Version:

Windows XP
Media Center Edition
Version 2002
Service Pack 2


Und Python 2.5...
Markus12
User
Beiträge: 195
Registriert: Dienstag 6. März 2007, 19:32
Wohnort: Frankfurt am Main

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

Code: Alles auswählen

import os
:D

Danke für den Tipp.
Antworten