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
的九位截断
pathlib
的 mkdir
本质上只是调用 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
它。
我正在尝试创建一个目录,其中设置了“执行时设置组 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
的九位截断pathlib
的 mkdir
本质上只是调用 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
它。