How can I get the file permission mask?

How can I get a permission mask for files like 644 or 755 on * nix using python? Is there any function or class for this? Could you guys help me? Thank you very much!

+53
python file file-permissions user-permissions
Mar 17 '11 at 9:19
source share
6 answers

os.stat is a wrapper for the stat (2) interface.

 >>> 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' 

Here you will find typical eight-step resolutions.

 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 

You are only interested in the least significant bits, so you can chop off the rest:

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



Sidenote: the tops determine the type of file, for example:

 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) 
+102
Mar 17 '11 at 9:44
source share

I think this is the best way to get the file in permission bits:

 stat.S_IMODE(os.lstat("file").st_mode) 

The os.lstat function will, if the file is a symbolic link, give you the mode of the link itself, while os.stat plays the link. Therefore, I find os.lstat the most useful.

Here's an example case, given the regular "testfile" file and a symbolic link to the latter, "testlink":

 import stat import os print oct(stat.S_IMODE(os.lstat("testlink").st_mode)) print oct(stat.S_IMODE(os.stat("testlink").st_mode)) 

This script outputs the following for me:

 0777 0666 
+40
Mar 17 '11 at 10:28
source share

Another way to do this, if you do not want to determine what stat means, use the os.access command http://docs.python.org/library/os.html#os.access BUT read the docs about possible security issues

For example, to check permissions on the test.dat file, which has read and write permissions

 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 
+7
Mar 17 2018-11-11T00:
source share

October (os.stat ('file') st_mode.) [4:]

+3
Mar 17 2018-11-11T00:
source share

There are many file-based functions inside the os module. If you run os.stat(filename) , you can always combine the results.

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

+1
Mar 17 '11 at 9:25
source share

os.stat is similar to c-lib stat (man 2 stat on linux to view information)

 stats = os.stat('file.txt') print stats.st_mode 
0
Mar 17 2018-11-11T00:
source share



All Articles