mkdir 没有正确设置权限

mkdir not setting permissions correctly

我正在尝试创建一个目录,其中设置了“执行时设置组 ID” 在 Python

在shell中:

$ mkdir --mode 2775 mail
$ ls -ld mail
drwxrwsr-x 1 john john 0 May  3 08:34 mail
      ^

在 Python 中,我使用的是 pathlib.Path.mkdir,似乎没有考虑模式的某些位, 即使 umask 被清除:

from pathlib import Path
import os

os.umask(0)
md = Path('mail')
md.mkdir(mode=0o2775)    

drwxrwxr-x 1 john john 0 May  3 08:35 mail
       ^

是否有一些不是documented

的九位截断

pathlibmkdir 本质上只是调用 os.mkdir()。那里的文档包括以下部分:

On some systems, mode is ignored. Where it is used, the current umask value is first masked out. If bits other than the last 9 (i.e. the last 3 digits of the octal representation of the mode) are set, their meaning is platform-dependent. On some platforms, they are ignored and you should call chmod() explicitly to set them.

所以保证只使用最后9位。 你必须做(不需要设置 umask):

md.mkdir()
md.chmod(0o2775)

如果pathlib不会默默地忽略额外的位,而是实际上抛出一个 ValueError 会更好。

最终,在 non-Windows 系统上,Path.mkdir 调用 os.mkdir,后者又调用 C 系统调用 mkdirat。该调用的行为是根据 mkdir 定义的,它在 Linux 上记录了 mode 与:

The argument mode specifies the permissions to use. It is modified by the process's umask in the usual way: the permissions of the created directory are (mode & ~umask & 0777)

请注意,权限明确屏蔽了上面的所有位 0777;这就是 mkdir 系统调用在某些操作系统上的行为方式。你只需要在事后 chmod 它。