57 votes

Écrire un fichier avec des autorisations spécifiques en Python

J'essaie de créer un fichier uniquement lisible et inscriptible par l'utilisateur ( 0600 ).

Est-ce la seule façon de le faire en utilisant os.open() comme suit?

 import os
fd = os.open('/path/to/file', os.O_WRONLY, int("0600", 8))
myFileObject = os.fdopen(fd)
myFileObject.write(...)
myFileObject.close()
 

Idéalement, j'aimerais pouvoir utiliser le mot clé with pour pouvoir fermer automatiquement l'objet. Y a-t-il une meilleure façon de faire ce que je fais ci-dessus?

41voto

vartec Points 53382

Quel est le problème? file.close() fermera le fichier même s'il était ouvert avec os.open() .

 with os.fdopen(os.open('/path/to/file', os.O_WRONLY | os.O_CREAT, 0600), 'w') as handle:
  handle.write(...)     
 

34voto

A-B-B Points 797

Cette réponse n'utilise pas l' with déclaration, mais il répond à plusieurs préoccupations avec la réponse par vartec, en particulier l' umask préoccupation.

Tout d'abord, si le mode souhaité 0600, elle ne peut plus être clairement spécifié que le nombre octal 0o600. Cette syntaxe est valable au moins dans la version 2.6 de Python+. Mieux encore, il suffit d'utiliser l' stat module.

import os, stat

mode = stat.S_IRUSR | stat.S_IWUSR  # This is 0o600 in octal and 384 in decimal.
umask_original = os.umask(0)
try:
    handle = os.fdopen(os.open('/path/to/file', os.O_WRONLY | os.O_CREAT, mode), 'w')
finally:
    os.umask(umask_original) 
handle.write(...)
handle.close()

À défaut de définir au préalable l' umask de 0 peut conduire à une erreur d' mode (permission), établis par os.open. C'est parce que la valeur par défaut umask peut ne pas être 0, et il peut être appliqué à l' mode. Par exemple, si mon originale umask est 2, et de mon mode spécifié est - 0o222, si je n'arrive pas à mettre la umask de 0, le fichier résultant peut, au lieu d'avoir un mode de mode ^ umask_original, c'est à dire 0o220, ce qui n'est pas ce que je voulais. Cela fait sens, en considérant mode ^ 0 == mode. Notez que ^ moyen XOR au niveau du bit.

Attention: L' umask est restauré à sa valeur d'origine dès que possible. Cette obtention et définition n'est pas thread-safe, et un threading.Lock doit être utilisé si nécessaire.

Techniquement, os.fdopen ne semble pas nécessaire dans l' try...finally bloc, et peut être en dehors d'elle. Seulement os.open semble nécessaire à l'intérieur du bloc.

12voto

jsbueno Points 22212

Vous pouvez utiliser os.chmod à la place:

 >>> import os
>>> name = "eek.txt"
>>> with open(name, "wt") as myfile:
...   os.chmod(name, 0600)
...   myfile.write("eeek")
...
>>> os.system("ls -lh " + name)
-rw------- 1 gwidion gwidion 4 2011-04-11 13:47 eek.txt
0
>>>
 

(Notez qu'il s'agit de Python 2.x, et 0600 est analysé comme un nombre octal dans lequel est probablement le seul cas d'utilisation de cette fonctionnalité)

Cependant, si votre sécurité est critique, vous devriez probablement recourir à sa création avec os.open, comme vous le faites et utiliser os.fdopen pour récupérer un objet Fichier Python à partir du gestionnaire de fichiers fourni par os.open

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