70 votes

Comment puis-je obtenir le masque d'autorisation Unix à partir d'un fichier ?

Comment puis-je obtenir le masque d'autorisation d'un fichier comme 644 ou 755 sur * nix en utilisant python ?

Existe-t-il une fonction ou une classe pour faire cela ? Merci beaucoup!

124voto

miku Points 63392

os.stat est un wrapper autour de l'interface d'appel système stat(2).

 >>> import os
>>> from stat import *
>>> os.stat("test.txt") # returns 10-tupel, you really want the 0th element ...
posix.stat_result(st_mode=33188, st_ino=57197013, \
    st_dev=234881026L, st_nlink=1, st_uid=501, st_gid=20, st_size=0, \
    st_atime=1300354697, st_mtime=1300354697, st_ctime=1300354697)

>>> os.stat("test.txt")[ST_MODE] # this is an int, but we like octal ...
33188

>>> oct(os.stat("test.txt")[ST_MODE])
'0100644'

À partir de là, vous reconnaîtrez les autorisations octales typiques.

 S_IRWXU 00700   mask for file owner permissions
S_IRUSR 00400   owner has read permission
S_IWUSR 00200   owner has write permission
S_IXUSR 00100   owner has execute permission
S_IRWXG 00070   mask for group permissions
S_IRGRP 00040   group has read permission
S_IWGRP 00020   group has write permission
S_IXGRP 00010   group has execute permission
S_IRWXO 00007   mask for permissions for others (not in group)
S_IROTH 00004   others have read permission
S_IWOTH 00002   others have write permission
S_IXOTH 00001   others have execute permission

Vous n'êtes vraiment intéressé que par les bits inférieurs, vous pouvez donc couper le reste :

 >>> oct(os.stat("test.txt")[ST_MODE])[-3:]
'644'
>>> # or better
>>> oct(os.stat("test.txt").st_mode & 0o777)

Note : les parties supérieures déterminent le type de fichier, par exemple :

 S_IFMT  0170000 bitmask for the file type bitfields
S_IFSOCK    0140000 socket
S_IFLNK 0120000 symbolic link
S_IFREG 0100000 regular file
S_IFBLK 0060000 block device
S_IFDIR 0040000 directory
S_IFCHR 0020000 character device
S_IFIFO 0010000 FIFO
S_ISUID 0004000 set UID bit
S_ISGID 0002000 set-group-ID bit (see below)
S_ISVTX 0001000 sticky bit (see below)

9voto

Dan Goldsmith Points 334

Une autre façon de le faire si vous ne voulez pas comprendre ce que signifie stat est d'utiliser la commande os.access http://docs.python.org/library/os.html#os.access MAIS lire les documents sur les problèmes de sécurité possibles

Par exemple pour vérifier les permissions sur le fichier test.dat qui a des permissions en lecture/écriture

 os.access("test.dat",os.R_OK)
>>> True

#Execute permissions
os.access("test.dat",os.X_OK)
>>> False

#And Combinations thereof
os.access("test.dat",os.R_OK or os.X_OK)
>>> True

os.access("test.dat",os.R_OK and os.X_OK)
>>> False

2voto

newliver Points 29

oct(os.stat('fichier').st_mode)[4:]

1voto

Jakob Bowyer Points 12873

Il y a beaucoup de fonctions basées sur des fichiers dans le module os, je suis sûr. Si vous exécutez os.stat(filename) vous pouvez toujours interpréter les résultats.

http://docs.python.org/library/stat.html

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