【问题标题】:python3 os.mkdir() does not enforce correct modepython3 os.mkdir() 不强制执行正确模式
【发布时间】:2016-09-04 06:04:14
【问题描述】:

这是错误还是功能?

当我使用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'

因为我希望能够创建一个包含父母和模式 o2770 的目录,所以这里是代码(pthpathlib.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)   

【问题讨论】:

标签: python-3.x mkdir


【解决方案1】:

这是一个功能。

documentation 提到了它,虽然是简短的:

os.mkdir(path[, mode])

使用数字模式创建一个名为 path 的目录。默认模式为 0777(八进制)。在某些系统上,模式被忽略。 在使用的地方,首先屏蔽掉当前的umask值。

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

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

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

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

您可以在 the documentation for mkdir():man 2 mkdir:

中亲自查看

参数mode 指定要使用的权限。由进程的umask以通常的方式修改:创建目录的权限为(mode & ~umask & 0777)。

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

【讨论】:

  • 完美答案,比重复的更详细,谢谢:)
猜你喜欢
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2020-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多