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?
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?
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'])
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
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
Dies funktioniert nicht für eine Datei auf einem anderen Server. Können Sie bitte für diesen Fall vorschlagen. Danke – Neo
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
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.
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
Die Verwendung von '+' scheint auch anstelle von '|' zu funktionieren. Ich weiß nicht, ob es einen Grund gibt, einen über dem anderen zu benutzen. – Shule
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
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.
Ich habe einige wie S_IRUSR gesehen..wie das funktioniert ??? –
ich denke, es ist nur ein wenig setzen und so, wenn Sie oder sie zusammen erhalten Sie 0444 –
Wenn Sie fragen "wie verwende ich symbolische Namen und was sie bedeuten", Ihre Artikulation ist stark fehlerhaft. – tripleee