J'essaie de changer la permission d'un accès de fichier:
os.chmod(path, mode)
Je veux le rendre en lecture seule:
os.chmod(path, 0444)
Existe-t-il un autre moyen de créer un fichier en lecture seule?
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
Les indicateurs suivants peuvent également être utilisés dans l'argument mode de os.chmod ():
stat.S_ISUID
Définit le bit UID.
stat.S_ISGID
Bit d'ID de groupe défini. Ce bit a plusieurs utilisations spéciales. Pour un répertoire indique que la sémantique BSD doit être utilisée pour cela répertoire: les fichiers créés à cet endroit héritent de leur identifiant de groupe du répertoire, pas à partir de l'ID de groupe effectif du processus de création, et les répertoires créés à cet endroit obtiendront également le bit S_ISGID. Pour un fichier qui n'a pas le bit d'exécution de groupe (S_IXGRP) défini, le Le bit set-group-ID indique le verrouillage de fichier/enregistrement obligatoire (voir aussi S_ENFMT).
stat.S_ISVTX
bit collant. Lorsque ce bit est défini sur un répertoire, cela signifie qu’un fichier de ce répertoire ne peut être renommé ou supprimé que par le fichier propriétaire du fichier, par le propriétaire du répertoire ou par un privilège processus.
stat.S_IRWXU
Masque pour les autorisations de propriétaire de fichier.
stat.S_IRUSR
Le propriétaire a une permission de lecture.
stat.S_IWUSR
Le propriétaire a une permission d'écriture.
stat.S_IXUSR
Le propriétaire a une autorisation d'exécution.
stat.S_IRWXG
Masque pour les autorisations de groupe.
stat.S_IRGRP
Le groupe a l'autorisation de lecture.
stat.S_IWGRP
Le groupe a le droit d'écriture.
stat.S_IXGRP
Le groupe dispose d'une autorisation d'exécution.
stat.S_IRWXO
Masque pour les autorisations pour les autres (pas dans le groupe).
stat.S_IROTH
D'autres ont la permission de lire.
stat.S_IWOTH
D'autres ont le droit d'écriture.
stat.S_IXOTH
D'autres ont une autorisation d'exécution.
stat.S_ENFMT
Application du verrouillage de fichier System V. Ce drapeau est partagé avec S_ISGID: le verrouillage de fichier/enregistrement est appliqué aux fichiers qui ne le font pas avoir le bit d'exécution de groupe (S_IXGRP) activé.
stat.S_IREAD
Synonyme Unix V7 pour S_IRUSR.
stat.S_IWRITE
synonyme Unix V7 pour S_IWUSR.
stat.S_IEXEC
Unix V7 synonyme de S_IXUSR.
os.chmod(path, 0444)
est la commande Python permettant de modifier les autorisations de fichiers dans Python 2.x. Pour une solution combinée Python 2 et Python 3, remplacez 0444
par 0o444
.
Vous pouvez toujours utiliser Python pour appeler la commande chmod à l’aide de subprocess
. Je pense que cela ne fonctionnera que sous Linux.
import subprocess
subprocess.call(['chmod', '0444', 'path'])
Toutes les réponses actuelles obstruent les autorisations non-write: elles rendent le fichier lisible mais non exécutable pour tout le monde. Certes, c'est parce que la question initiale a demandé des autorisations 444
- mais nous pouvons faire mieux!
Voici une solution qui laisse tous les bits "lire" et "exécuter" intacts. J'ai écrit un code verbeux pour le rendre facile à comprendre; vous pouvez le rendre plus concis si vous le souhaitez.
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)
Pourquoi ça marche?
Comme John La Rooy l'a souligné }, stat.S_IWUSR
signifie fondamentalement "le masque de bits pour les autorisations d'écriture de l'utilisateur". Nous voulons définir le bit d'autorisation correspondant sur 0. Pour cela, nous avons besoin du masque de bits exact opposé (c'est-à-dire, un avec un 0 à cet emplacement et un 1 partout ailleurs). L'opérateur ~
, qui retourne tous les bits, nous donne exactement cela. Si nous l’appliquons à n’importe quelle variable via l’opérateur "bitwise and" (&
), le bit correspondant sera mis à zéro.
Nous devons également répéter cette logique avec les bits d'autorisation "groupe" et "autre". Ici, nous pouvons gagner un peu de temps en ne faisant que &
'les assembler tous ensemble (formant la constante NO_WRITING
bit).
La dernière étape consiste à obtenir les autorisations du fichier en cours } _ et à effectuer l'opération bit à bit et l'opération.
Incluez simplement les autorisations entières en octal (fonctionne à la fois pour python 2 et python3):
os.chmod(path, 0o444)