“Sticky bit”仅适用于目录?我发现它可能在文件上,很奇怪

时间:2017-01-03 02:36:29

标签: c linux file-permissions

来自网站的样本说“粘性位”用于目录,例如

$ ll /tmp
drwxrwxrwt 16 root root   4096 1月   2 15:45 ./

我们可以看到/ tmp的执行权限是“t”,每个人都可以执行,但某些目录只能由“root”或其所有者操作。

所以我之前的理解是,此文件权限标志仅适用于目录,但不适用于文件。但是,当我使用“open”函数创建文件时,我遇到了这个问题,我没有指定任何文件权限作为第三个参数,所以我的程序是:

#include<fcntl.h>
#include<unistd.h>
int main()
{
    int f1=open("./mytest_c1.txt",O_CREAT|O_RDWR);
    write(f1,"abc xyz\n",8);
    close(f1);
    return 0;
}

执行后,我得到了一个这样的文件:

--wxr-x--T 1 x x     8 1月   2 11:38 mytest_c1.txt*

很奇怪,这是一个大写的“T”。

  1. 我是如何产生这个“T”标志的?我没有说明任何内容。
  2. 与小写“t”有什么区别?
  3. 所以我继续我的实验,我删除了“写”语句,因为:

    #include<fcntl.h>
    #include<unistd.h>
    int main()
    {
        int f1=open("./mytest_c2.txt",O_CREAT|O_RDWR);
        close(f1);
        return 0;
    }
    

    运行结果创建了另一个文件:

    -rw---x--T 1 x x     0 1月   2 15:59 mytest_c2.txt*
    

    这一次,奇怪的是。 mytest_c2.txt的文件权限与mytest_c1.txt不同。

    这种差异来自哪里?我的程序中没有指定任何内容!

2 个答案:

答案 0 :(得分:4)

这是不正确的:

int f1=open("./mytest_c1.txt",O_CREAT|O_RDWR);

此声明invokes undefined behavior(UB)。每当您对包含open(2)的标记使用O_CREAT时,必须(如manpages中所述)指定文件模式。您看到的粘性位是由于UB而发生意外情况的结果。

现在,其他一些有趣的观点:

  

我们可以看到/ tmp的执行权限是&#34; t&#34;,每个人都可以执行,但某些目录只能由&#34; root&#34;或其所有者。

这不是错误,但它有点误导。更确切地说,如果一个目录有一个粘滞位(例如,/tmp通常会这样做),这意味着任何人都可以在该目录中创建文件,但只有所有者< / strong>(和root,因为root几乎可以执行任何操作)可以在文件创建后修改或排除。

下一步:

  

来自网站的样本说&#34;粘性位&#34;用于目录,例如

此外,没有错,但有点误导。粘性位can be applied to files,但Linux只是忽略它们。

答案 1 :(得分:1)

差异:表示粘滞位,在t版本中,执行位置位且T执行位未置位。

原因:Linux从父目录继承权限(如果在目录上设置ACL,则只有该目录中的文件继承ACL。如果创建子目录,除非ACL,否则不会获取父ACL设置为递归)所以在这种情况下,设置文件所在的文件夹...对于该粘滞位。这就是新创建的文件继承它的原因。

  

对于我的情况,ACL设置为递归。对于OP的情况也被设置为   recurse否则它不会继承父级的父级ACL。