webentwicklung-frage-antwort-db.com.de

Dateiberechtigung in Python ändern

Ich versuche die Erlaubnis eines Dateizugriffs zu ändern:

os.chmod(path, mode)

Ich möchte es schreibgeschützt machen:

os.chmod(path, 0444)

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

36
Abul Hasnat
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)

stat

Die folgenden Flags können auch im Modusargument von .__ verwendet werden. os.chmod ():

stat.S_ISUID Setze das UID-Bit.

stat.S_ISGID Set-Group-ID-Bit. Dieses Bit hat mehrere spezielle Verwendungen. Zum In einem Verzeichnis wird angezeigt, dass die BSD-Semantik für diese .__ verwendet werden soll. Verzeichnis: Dort erstellte Dateien erben ihre Gruppen-ID von der Verzeichnis, nicht aus der effektiven Gruppen-ID des Erstellungsprozesses, und dort erstellte Verzeichnisse erhalten auch das S_ISGID-Bit gesetzt. Für ein Datei, für die das Gruppenausführungsbit (S_IXGRP) nicht festgelegt ist, die Das Set-Group-ID-Bit zeigt das obligatorische Sperren von Dateien/Datensätzen an (siehe auch S_ENFMT).

stat.S_ISVTX Klebriges Bit. Wenn dieses Bit für ein Verzeichnis gesetzt ist, bedeutet es dass eine Datei in diesem Verzeichnis nur von der .__-Datei umbenannt oder gelöscht werden kann. Eigentümer der Datei, vom Eigentümer des Verzeichnisses oder von einem privilegierten verarbeiten.

stat.S_IRWXU Maske für Dateibesitzer-Berechtigungen.

stat.S_IRUSR Besitzer hat Leseberechtigung.

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 Personen (nicht in Gruppe).

stat.S_IROTH Andere haben Leseberechtigung.

stat.S_IWOTH Andere haben Schreibrechte.

stat.S_IXOTH Andere haben Ausführungsberechtigung.

stat.S_ENFMT System V Dateisperrung erzwingen. Dieses Flag wird geteilt mit S_ISGID: Das Sperren von Dateien/Datensätzen wird für Dateien erzwungen, die nicht. haben das Gruppenausführungsbit (S_IXGRP) gesetzt.

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.

57
John La Rooy

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

Sie können den Befehl chmod immer mit Python mit subprocess aufrufen. Ich denke, dass dies nur unter Linux funktionieren wird.

import subprocess

subprocess.call(['chmod', '0444', 'path'])
27
Inbar Rose

Alle aktuellen Antworten enthalten die Berechtigungen non-writing: Sie machen die Datei für jeden lesbar, aber nicht ausführbar. Zugegeben, dies liegt daran, dass die ursprüngliche Frage nach 444-Berechtigungen gefragt wurde - 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 ausführlichen Code geschrieben, um es leicht verständlich zu machen. Sie können es knapper 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?

Wie John La Rooy darauf hingewiesen hat , bedeutet stat.S_IWUSR grundsätzlich "die Bitmaske für die Schreibberechtigungen des Benutzers". Wir möchten das entsprechende Berechtigungsbit auf 0 setzen. Dazu benötigen wir die genaue Gegenseite - Bitmaske (d. H. Eine mit einer 0 an diesem Ort und eine 1 überall sonst). Der ~-Operator, der alle Bits umkehrt, gibt uns genau das. Wenn wir dies über den Operator "bitwise and" (&) 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, indem wir nur & 'alle zusammensetzen (die NO_WRITING-Bit-Konstante bilden).

Der letzte Schritt besteht darin, die aktuellen Berechtigungen der Datei abzurufen und tatsächlich die bitweise Operation auszuführen.

13
Chip Hogg

Fügen Sie einfach die Berechtigungen Integer in Oktal ein (funktioniert für Python 2 und Python3):

os.chmod(path, 0o444)

Hier ist eine Funktion zum Konvertieren einer Berechtigungszeichenfolge mit 9 Zeichen (z. B. 'rwsr-x-wt') in eine Maske, die mit os.chmod() verwendet werden kann.

def perm2mask(p):

    assert len(p) == 9, 'Bad permission length'
    assert all(p[k] in 'rw-' for k in [0,1,3,4,6,7]), 'Bad permission format (read-write)'
    assert all(p[k] in 'xs-' for k in [2,5]), 'Bad permission format (execute)'
    assert p[8] in 'xt', 'Bad permission format (execute other)'

    m = 0

    if p[0] == 'r': m |= stat.S_IRUSR 
    if p[1] == 'w': m |= stat.S_IWUSR 
    if p[2] == 'x': m |= stat.S_IXUSR 
    if p[2] == 's': m |= stat.S_IXUSR | stat.S_ISUID 

    if p[3] == 'r': m |= stat.S_IRGRP 
    if p[4] == 'w': m |= stat.S_IWGRP 
    if p[5] == 'x': m |= stat.S_IXGRP 
    if p[5] == 's': m |= stat.S_IXGRP | stat.S_ISGID 

    if p[6] == 'r': m |= stat.S_IROTH 
    if p[7] == 'w': m |= stat.S_IWOTH 
    if p[8] == 'x': m |= stat.S_IXOTH 
    if p[8] == 't': m |= stat.S_IXOTH | stat.S_ISVTX

    return m

Beachten Sie, dass durch das Setzen der SUID/SGID/SVTX-Bits automatisch das entsprechende Ausführungsbit gesetzt wird. Ohne dies wäre die resultierende Berechtigung ungültig (ST Zeichen).

0
Sheljohn

Keine Notwendigkeit, sich an Flaggen zu erinnern. Denken Sie daran, dass Sie immer Folgendes tun können:

subprocess.call(["chmod", "a-w", "file/path])

Nicht portabel, aber einfach zu schreiben und zu merken:

  • u - Benutzer
  • g - Gruppe
  • o - andere
  • a - alles
  • + oder - (Berechtigung hinzufügen oder entfernen)
  • r - lesen
  • w - schreiben
  • x - ausführen

Verweisen man chmod für zusätzliche Optionen und genauere Erklärungen.

0
solgar