0

I am trying to find the equivalent Python code to this PHP code, but I'm not sure how to translate the 0640:

PHP code:

chmod($credentials_file, 0640);
chown($credentials_file, 'webapp');

I'm looking at the os.chmod documentation here, but I'm not sure how 0640 equates to stat.SOMETHING_HERE. Does anyone have any idea how to port these two lines to Python?

Brett
  • 11,637
  • 34
  • 127
  • 213
  • possible duplicate of [Python module os.chmod(file, 664) does not change the permission to rw-rw-r-- but -w--wx----](http://stackoverflow.com/questions/15607903/python-module-os-chmodfile-664-does-not-change-the-permission-to-rw-rw-r-bu) – Jay Blanchard Feb 13 '15 at 16:35
  • That answer doesn't discuss the `stat.*` options though. How can I find what `0640` means so that I can use the approach that the docs (references in the question) recommend? – Brett Feb 13 '15 at 16:37
  • [CHMOD](http://en.wikipedia.org/wiki/Chmod) – Jay Blanchard Feb 13 '15 at 16:38
  • `0640`: `6` = owner read/writable, `4` = group readable, `0` = others non-readable – Michael Berkowski Feb 13 '15 at 16:39

1 Answers1

5

0640 is an octal number (that is the meaning of the leading 0, which doesn't count as a digit), and means the following permissions (see e.g. Wikipedia):

  • the first digit is for the file's owner, and (as 6 is 110 in binary, where the bits are read, write and execute permission respectively) means read and write permission;
  • the second digit is for the group, and (as 4 is 100 in binary) means read-only; and
  • the third digit is for other users, and means no permissions (0 is 000!)

Therefore in this case you want to combine S_IRUSR (user read), S_IWUSR (user write) and S_IRGRP (group read):

>>> import stat
>>> oct(stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP)
'0640'

You can see each permission individually by displaying the octal number in binary form:

>>> bin(0640)
'0b110100000'

This breaks down as follows:

 # USR
0b 110 100 000
 # ^ user read (yes)
 #  ^ user write (yes)
 #   ^ user execute (no)

     # GRP
0b 110 100 000
     # ^ group read (yes)
     #  ^ group write (no)
     #   ^ group execute (no)

         # OTH
0b 110 100 000
         # ^ other read (no)
         #  ^ other write (no)
         #   ^ other execute (no)
jonrsharpe
  • 115,751
  • 26
  • 228
  • 437
  • Exactly what I needed to know (and not what the "possible duplicate" post talks about). Thanks! – Brett Feb 13 '15 at 16:39
  • @Brett I've just realised I didn't make explicit that you *can* just use `0640` as the second argument to `os.chmod`; the constants in `stat` are just e.g. `stat.S_IWUSR == 128`, there's nothing special about them. – jonrsharpe Feb 13 '15 at 18:30