2013-04-27 16 views
21

Ich versuche, die Erlaubnis eines Dateizugriff zu ändern:Ändern

os.chmod(path, mode) 

Ich mag es schreibgeschützt machen:

os.chmod(path, 0444) 

Gibt es eine andere Möglichkeit, eine Datei machen schreibgeschützt?

+0

Ich habe einige wie S_IRUSR gesehen..wie das funktioniert ??? –

+0

ich denke, es ist nur ein wenig setzen und so, wenn Sie oder sie zusammen erhalten Sie 0444 –

+2

Wenn Sie fragen "wie verwende ich symbolische Namen und was sie bedeuten", Ihre Artikulation ist stark fehlerhaft. – tripleee

Antwort

21

os.chmod(path, 0444)ist der Python-Befehl zum Ändern der Dateiberechtigungen in Python 2.x. Ändern Sie für eine kombinierte Python 2- und Python 3-Lösung 0444 in 0o444.

Sie könnten Python immer verwenden, um den chmod-Befehl mit subprocess aufzurufen. Ich denke, das wird nur unter Linux funktionieren.

stat.S_ISUID Set-UID-Bit:

import subprocess 

subprocess.call(['chmod', '0444', 'path']) 
+0

os.chmod kann die richtige Funktion sein, aber 0444 (in 'os.chmod (Pfad, 0444)'), da ein int einen SyntaxError verursacht (wegen der führenden 0), und in der String-Form wird es nicht Gib den gewünschten Effekt. Sie müssen die Zahl in das Zahlensystem der Methode übersetzen, das nicht dasselbe ist. Vielleicht wusstest du das, aber andere wissen es vielleicht nicht. – Shule

+2

Vergiss meinen Kommentar! Entschuldigung Inbar Rose. Du bist in Ordnung. Anscheinend funktioniert 0444 in Python 2.x großartig. Es verursacht jedoch einen SyntaxError in Python 3.x. Um es zu beheben, tun Sie stattdessen 0o444 in Python 3.x. – Shule

+0

Dies funktioniert nicht für eine Datei auf einem anderen Server. Können Sie bitte für diesen Fall vorschlagen. Danke – Neo

45
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH) 

stat

Die folgenden Flags können auch im Modus Argument von os.chmod() verwendet werden.

stat.S_ISGID Set-Gruppen-ID-Bit. Dieses Bit hat mehrere spezielle Anwendungen. Für ein Verzeichnis zeigt an, dass BSD-Semantik für das Verzeichnis verwendet werden soll: dort erstellte Dateien erben ihre Gruppen-ID aus dem Verzeichnis , nicht von der effektiven Gruppen-ID des Erstellungsprozesses, und dort erstellte Verzeichnisse erhalten auch die S_ISGID-Bit gesetzt. Bei einer Datei, in der das Gruppenausführungsbit (S_IXGRP) nicht gesetzt ist, gibt das Set-Group-ID-Bit die obligatorische Datei-/Datensatzsperrung an (siehe auch S_ENFMT).

stat.S_ISVTX Klebriges Bit. Wenn dieses Bit in einem Verzeichnis gesetzt ist, bedeutet dies , dass eine Datei in diesem Verzeichnis nur vom Eigentümer der Datei , vom Eigentümer des Verzeichnisses oder von einem privilegierten Prozess umbenannt oder gelöscht werden kann.

stat.S_IRWXU Maske für Dateiberechtigungen.

stat.S_IRUSR Besitzer hat die Erlaubnis gelesen.

stat.S_IWUSR Besitzer hat Schreibberechtigung.

stat.S_IXUSR Besitzer hat Ausführungsberechtigung.

stat.S_IRWXG Maske für Gruppenberechtigungen.

stat.S_IRGRP Gruppe hat Leseberechtigung.

stat.S_IWGRP Gruppe hat Schreibberechtigung.

stat.S_IXGRP Gruppe hat Ausführungsberechtigung.

stat.S_IRWXO Maske für Berechtigungen für andere (nicht in Gruppe).

stat.S_IROTH Andere haben Leseberechtigung.

stat.S_IWOTH Andere haben Schreibberechtigung.

stat.S_IXOTH Andere haben Ausführungsberechtigung.

stat.S_ENFMT System V Dateisperre Durchsetzung. Dieses Flag wird mit S_ISGID gemeinsam genutzt: Datei-/Datensatzsperrung wird für Dateien erzwungen, die das Gruppenausführungsbit (S_IXGRP) nicht haben.

stat.S_IREAD Unix V7 Synonym für S_IRUSR.

stat.S_IWRITE Unix V7 Synonym für S_IWUSR.

stat.S_IEXEC Unix V7 Synonym für S_IXUSR.

+4

Die Konstanten in 'stat' sind einfach Bequemlichkeitsleserzucker. 'S_IRUSR' ist 0400,' S_IRGRP' ist 040, 'S_IROTH' ist 4; Wenn Sie sie mit einem bitweisen OR kombinieren, erhalten Sie 0444. Sie könnten sie einfach hinzufügen, aber im allgemeinen Fall ist OR korrekt, weil es auch bei überlappenden Bits funktioniert (0444 ODER 0444 ist 0444, während die Addition einen anderen und falschen Wert ergibt)). – tripleee

+0

Die Verwendung von '+' scheint auch anstelle von '|' zu funktionieren. Ich weiß nicht, ob es einen Grund gibt, einen über dem anderen zu benutzen. – Shule

+0

Es gibt keine Erklärung dazu, Sie müssen die Kommentare lesen, die Kommentare oder den Link, um es zu verstehen, es sei denn, Sie wissen bereits, was stat tut. Nur eine kleine Erklärung würde es viel besser machen. – DonyorM

11

Alle aktuellen Antworten clobber die Nicht-Schreiben Berechtigungen: sie für alle die Datei lesbar-but-not-ausführbar zu machen. Zugegeben, dies ist, weil die erste Frage nach 444 Berechtigungen gefragt - aber wir können es besser machen!

Hier ist eine Lösung, die alle einzelnen Bits "Lesen" und "Ausführen" unberührt lässt. Ich habe einen ausführlichen Code geschrieben, um das Verständnis zu erleichtern. Sie können es kürzer machen, wenn Sie möchten.

import os 
import stat 

def remove_write_permissions(path): 
    """Remove write permissions from this path, while keeping all other permissions intact. 

    Params: 
     path: The path whose permissions to alter. 
    """ 
    NO_USER_WRITING = ~stat.S_IWUSR 
    NO_GROUP_WRITING = ~stat.S_IWGRP 
    NO_OTHER_WRITING = ~stat.S_IWOTH 
    NO_WRITING = NO_USER_WRITING & NO_GROUP_WRITING & NO_OTHER_WRITING 

    current_permissions = stat.S_IMODE(os.lstat(path).st_mode) 
    os.chmod(path, current_permissions & NO_WRITING) 

Warum funktioniert das?

Als John La Rooy pointed out bedeutet stat.S_IWUSR grundsätzlich "die Bitmaske für die Schreibrechte des Benutzers". Wir wollen das entsprechende Erlaubnis-Bit auf 0 setzen. Dazu benötigen wir die genaue entgegengesetzte Bitmaske (d. H. Eins mit einer 0 an dieser Stelle und 1 überall sonst). Der Operator ~, der alle Bits umdreht, gibt uns genau das. Wenn wir dies über den Operator "bitweises und" (&) auf eine Variable anwenden, wird das entsprechende Bit auf Null gesetzt.

Wir müssen diese Logik auch mit den Berechtigungsbits "group" und "other" wiederholen. Hier können wir etwas Zeit sparen durch nur & 'sie alle zusammen (bilden die NO_WRITING Bit-Konstante).

Der letzte Schritt ist get the current file's permissions, und führen Sie tatsächlich die bitweise und Operation.