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

Zugriffsrechte von Dateien: Änderungen vornehmen

Beitragvon Markus12 » Samstag 27. Oktober 2007, 16:53

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

Beitragvon BlackJack » Samstag 27. Oktober 2007, 19:06

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

Beitragvon Markus12 » Sonntag 28. Oktober 2007, 11:58

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 28. Oktober 2007, 12:06

Wie machst du es? Hier funktioniert das einwandfrei.

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

Beitragvon Markus12 » Sonntag 28. Oktober 2007, 12:16

...

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 28. Oktober 2007, 12:31

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

Beitragvon Markus12 » Sonntag 28. Oktober 2007, 12:40

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 -.-
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 28. Oktober 2007, 12:50

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

Beitragvon gerold » Sonntag 28. Oktober 2007, 13:31

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 28. Oktober 2007, 13:50

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=]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.[/code]
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
Kontaktdaten:

Beitragvon Markus12 » Sonntag 28. Oktober 2007, 14:36

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

Beitragvon Markus12 » Sonntag 28. Oktober 2007, 14:53

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: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 28. Oktober 2007, 15:02

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

Beitragvon Markus12 » Sonntag 28. Oktober 2007, 15:07

Was meinst du mit "quoten"? :D
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 28. Oktober 2007, 15:09

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder