它是一个错误还是一个功能?
当我使用os.mkdir(idem with 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'
Run Code Online (Sandbox Code Playgroud)
因为我希望能够与父母和模式 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)
Run Code Online (Sandbox Code Playgroud)
这是一个特点。
该文件提到它,尽管是短暂的:
os.mkdir(path[, mode])使用数字模式模式创建一个名为 path 的目录。默认模式是 0777(八进制)。在某些系统上,模式被忽略。在使用它的地方,首先屏蔽掉当前的 umask 值。
一个面具是每处理设定,施加到所有新创建的文件/目录的限制的权限。
umask 是一个数字(通常以八进制表示),就像权限本身一样,但是在结果权限中不允许在umask 中设置任何位。例如,如果您的 umask 是0o022(常见默认值),则新创建的文件/目录将永远不会拥有组或世界写入权限。
对新创建的文件/目录的权限也始终限制为最后三个八进制数字(即0o777)。因此,如果您的 umask 是0o022,则一切都表现得好像真的一样0o7022。这就是您的 setgid 位也被删除的原因。
顺便说一下,这不是 Python 的东西;这是一个 Unix 的东西。它不仅适用于 Python,也适用于 Ubuntu 中的所有程序。您可以通过umask在终端中输入命令来检查当前的 umask 。事实上,umask 是由 Linux 内核在执行mkdir()Python(和所有其他程序)调用以创建目录的系统调用时强制执行的。
您可以在::的文档中mkdir()亲眼看到这一点man 2 mkdir:
参数mode指定要使用的权限。它是由进程的umask以通常的方式修改的:创建的目录的权限是 ( mode & ~ umask & 0777)。
原因当然是安全。使用 umask,用户可以对默认权限进行大量控制(例如阻止世界甚至组的默认读取权限)。如果您需要粘性、setuid、setgid、组可写或全局可写的文件(假设有0o022umask),则需要使用 chmod 显式执行此操作。
| 归档时间: |
|
| 查看次数: |
4833 次 |
| 最近记录: |