gpt4 book ai didi

python-3.x - python3 os.mkdir() 不强制执行正确模式

转载 作者:行者123 更新时间:2023-12-03 20:34:03 28 4
gpt4 key购买 nike

它是错误还是功能?

当我使用 os.mkdir 创建目录时(与 pathlib.Path.mkdir 同上)和显式模式,创建的目录的权限不适合。如果我使用 os.chmod 强制执行再次,它的工作...

>>> import sys, os
>>> sys.version
'3.4.3 (default, Feb 27 2015, 18:13:37) \n[GCC 4.4.5]'
>>> os.mkdir('truite', mode=0o2770)
>>> oct(os.stat('truite').st_mode)
'0o40750'
>>> os.chmod('truite', 0o2770)
>>> oct(os.stat('truite').st_mode)
'0o42770'

因为我希望能够使用 parent 和模式 o2770 创建一个目录,所以这里是代码( pth 是一个 pathlib.Path 对象):
def make_shared_dir(pth) :
if not pth.parent.is_dir() :
make_shared_dir(pth.parent)
if not pth.is_dir() :
pth.mkdir()
pth.chmod(0o2770)

最佳答案

这是一个特点。

documentation提到它,虽然简短:

os.mkdir(path[, mode])

Create a directory named path with numeric mode mode. The default mode is 0777 (octal). On some systems, mode is ignored. Where it is used, the current umask value is first masked out.



一个 umask是每个进程的设置,它限制应用于所有新创建的文件/目录的权限。

umask 是一个数字(通常以八进制表示),就像权限本身一样,但任何位是 设置 在 umask 中是 不允许 在生成的权限中。例如,如果您的 umask 是 0o022 (一个常见的默认值),新创建的文件/目录将永远不会拥有组或世界写入权限。

对新创建的文件/目录的权限也总是限制为最后三个八进制数字(即 0o777 )。所以如果你的umask是 0o022 , 一切都表现得好像真的是 0o7022 .
这就是为什么您的 setgid 位也被删除的原因。

顺便说一句,这不是 Python 的东西。这是一个 Unix 的东西。它不仅适用于 Python,还适用于 Ubuntu 中的所有程序。您可以通过输入 umask 来检查您当前的 umask。终端中的命令。事实上,umask 是由 Linux 内核在执行 mkdir() 时强制执行的。 Python(和所有其他程序)为创建目录而调用的系统调用。

您可以在 the documentation for mkdir() 中亲自查看。 : man 2 mkdir :

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).



原因当然是安全性。使用 umask,用户可以很好地控制默认权限(例如,阻止世界甚至组的默认读取权限)。如果您想要粘性、setuid、setgid、group-writable 或 world-writable 文件(假设 0o022 umask),则需要使用 chmod 显式执行此操作。

关于python-3.x - python3 os.mkdir() 不强制执行正确模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37118558/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com