86 votes

Modifier les permissions d'un fichier en Python

J'essaie de modifier l'autorisation d'accès à un fichier :

os.chmod(path, mode)

Je veux qu'il soit en lecture seule :

os.chmod(path, 0444)

Existe-t-il un autre moyen de rendre un fichier en lecture seule ?

89voto

gnibbler Points 103484
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)

statut

Les drapeaux suivants peuvent également être utilisés dans l'argument mode de la commande os.chmod() :

stat.S_ISUID Définir le bit UID.

stat.S_ISGID Set-group-ID bit. Ce bit a plusieurs usages particuliers. Pour un un répertoire, il indique que la sémantique BSD doit être utilisée pour ce répertoire. répertoire : les fichiers qui y sont créés héritent de l'ID de groupe du répertoire, et non de l'ID de groupe. et non de l'ID de groupe effectif du processus de création, et les répertoires qui y sont créés auront également le bit S_ISGID activé. Pour un qui n'a pas le bit d'exécution de groupe (S_IXGRP), le bit set-group-ID indique un verrouillage obligatoire du fichier/enregistrement (voir aussi S_ENFMT).

stat.S_ISVTX Petit bout de ficelle. Lorsque ce bit est activé dans un répertoire, cela signifie que qu'un fichier dans ce répertoire ne peut être renommé ou supprimé que par le propriétaire du fichier, par le propriétaire du répertoire ou par un processus privilégié. privilégié.

stat.S_IRWXU Masque pour les autorisations du propriétaire du fichier.

stat.S_IRUSR Le propriétaire a lu l'autorisation.

stat.S_IWUSR Le propriétaire a l'autorisation d'écrire.

stat.S_IXUSR Le propriétaire dispose d'une autorisation d'exécution.

stat.S_IRWXG Masque pour les autorisations de groupe.

stat.S_IRGRP Le groupe a l'autorisation de lire.

stat.S_IWGRP Le groupe dispose d'une autorisation d'écriture.

stat.S_IXGRP Le groupe a le droit d'exécuter.

stat.S_IRWXO Masque pour les autorisations d'autres personnes (ne faisant pas partie du groupe).

stat.S_IROTH D'autres ont lu l'autorisation.

stat.S_IWOTH D'autres ont l'autorisation d'écrire.

stat.S_IXOTH D'autres ont exécuté la permission.

stat.S_ENFMT Application du verrouillage des fichiers du système V. Ce drapeau est partagé avec S_ISGID : le verrouillage des fichiers/enregistrements est appliqué aux fichiers qui n'ont pas pas le bit d'exécution de groupe (S_IXGRP).

stat.S_IREAD Synonyme de S_IRUSR sous Unix V7.

stat.S_IWRITE Synonyme de S_IWUSR sous Unix V7.

stat.S_IEXEC Synonyme de S_IXUSR sous Unix V7.

38voto

Inbar Rose Points 13033

os.chmod(path, 0444) est la commande Python permettant de modifier les permissions de fichiers dans Python 2.x. Pour une solution combinant Python 2 et Python 3, modifiez la commande 0444 a 0o444 .

Vous pouvez toujours utiliser Python pour appeler la commande chmod en utilisant subprocess . Je pense que cela ne fonctionnera que sous Linux.

import subprocess

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

36voto

Il suffit d'inclure les permissions entières en octal (fonctionne pour python 2 et python 3) :

os.chmod(path, 0o444)

20voto

Chip Hogg Points 330

Toutes les réponses actuelles font l'impasse sur la non-écriture : elles rendent le fichier lisible mais non exécutable pour tout le monde. Je vous l'accorde, c'est parce que la question initiale demandait des 444 mais nous pouvons faire mieux !

Voici une solution qui laisse intacts tous les bits individuels de "lecture" et d'"exécution". J'ai écrit un code verbeux pour le rendre facile à comprendre ; vous pouvez le rendre plus laconique 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 cela fonctionne-t-il ?

En John La Rooy a souligné , stat.S_IWUSR signifie en fait "le masque de bits pour les droits d'écriture de l'utilisateur". Nous voulons mettre le bit de permission correspondant à 0. Pour ce faire, nous avons besoin de la fonction exactement le contraire (c'est-à-dire un masque de bits avec un 0 à cet endroit et des 1 partout ailleurs). Les ~ qui renverse tous les bits, nous donne exactement cela. Si nous appliquons cela à n'importe quelle variable via l'opérateur "bitwise and" ( & ), il met à zéro le bit correspondant.

Nous devons également répéter cette logique avec les bits de permission "group" et "other". Ici, nous pouvons gagner du temps en utilisant simplement & Les deux parties sont réunies (pour former le NO_WRITING constante).

La dernière étape consiste à obtenir les permissions du fichier courant et effectuer l'opération "bitwise-and".

7voto

Megha Chovatiya Points 347

Il suffit d'ajouter 0 avant le numéro de l'autorisation :
Par exemple, nous voulons donner toutes les autorisations - 777
Syntaxe : os.chmod("nom_du_fichier" , permission)

import os
os.chmod("file_name" , 0777)

La version 3.7 de Python ne supporte pas cette syntaxe. Elle exige le préfixe '0o' pour les valeurs littérales octales - voici le commentaire que j'ai obtenu dans PyCharm

Ainsi, pour python 3.7, ce sera

import os
os.chmod("file_name" , 0o777)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X