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?
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
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.
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'])
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.
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).
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:
Verweisen man chmod
für zusätzliche Optionen und genauere Erklärungen.