web-dev-qa-db-fra.com

Changer l'autorisation du fichier en Python

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?

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

stat

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.

57
John La Rooy

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'])
27
Inbar Rose

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.

13
Chip Hogg

Incluez simplement les autorisations entières en octal (fonctionne à la fois pour python 2 et python3):

os.chmod(path, 0o444)