2016-05-09 72 views
0

它是一个错误或功能?python3 os.mkdir()不强制正确模式

当我使用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) 
+0

确认Ubuntu 14.04,Python 3.4.3。根据文档:在某些系统上,模式被忽略。 –

+0

[使用os.makedirs(python)创建dir时的权限问题]可能的重复](http://stackoverflow.com/questions/5231901/permission-problems-when-creating-a-dir-with-os-makedirs- python) –

回答

2

这是一个功能。

documentation提到它,尽管是短暂的:

os.mkdir(path[, mode])

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

umask是限制施加到所有新创建的文件/目录的权限的每个进程的设置。

甲umask是一个数(通常以八进制提交)就像自己的权限,但任何位是在umask中设置不允许在所得到的权限。例如,如果您的umask是0o022(通用默认值),则新创建的文件/目录不会具有组或世界写入权限。

新建文件/目录的权限也总是限制在最后三个八进制数字(即0o777)。所以如果你的umask是0o022,那么所有的行为就好像它真的是0o7022。 这就是为什么你的setgid位也被丢弃的原因。

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

您可以在the documentation for mkdir()看到自己这一点:man 2 mkdir

的参数模式指定要使用的权限。它是由过程的的umask以通常的方式修改:创建的目录的权限是(模式 &〜的umask & 0777)。

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

+1

完美答案,比重复更详细,谢谢:) – yota