创建文件夹权限问题:临时标志

keb*_*ebs 6 permissions mkdir

我对目录权限有一个奇怪的问题。

在 C++ 应用程序中,我创建了一个文件夹,其中包含: mkdir( "foldername", 777 );

但是我在尝试在该文件夹中创建文件时遇到问题,fopen()返回NULLerrno告诉我Permission denied. 所以我检查了,确实,我对创建的文件夹具有以下权限:dr----x--t

(根文件夹有drwxrwxr-x

我查了一下,这个不寻常的t意思是“暂时的”,但我不知道这是什么意思。

chmod 777 foldername从 shell 完成这项工作并将属性设置为drwxrwxrwx,但我不能每次都手动完成。

问题:关于发生了什么的任何线索?为什么我的应用没有正确设置文件夹属性?这个“临时”属性的含义是什么?

(系统为 Ubuntu 12.04)

Chr*_*own 7

t不是“临时的”,这意味着设置了粘性位。来自man ls

t [意味着] 粘滞位已设置(模式 1000),并且是可搜索或可执行的。(参见 chmod(1) 或 sticky(8)。)

此处设置粘滞位是因为您设置的是十进制777(八进制 1411),而不是八进制777(十进制 511)。您需要编写0777以使用八进制,而不是777.

您还应该注意,modeto 参数的最终效果mkdir还涉及对您的 umask 进行 AND 运算。来自man 2 mkdir

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

我建议,如果这会影响你,你chmod以后mkdir而不是使用mode参数。

最后一句警告:模式 777 几乎从来都不是您真正想要做的。与其向所有用户全局打开目录,不如考虑在目录上设置适当的模式和所有者/组。如果您需要更复杂的规则,请考虑使用 ACL。