为什么默认的文件创建权限是 666?

Pet*_*ter 14 filesystems permissions files

正如我发现的那样,在使用 umask 时,您可以授予文件的最高权限是 666。这是由umask 0000. 这是因为默认文件创建权限在我知道的每个系统上似乎都是 666。

我知道对于文件,我们需要可执行权限来显示其内容。
但是为什么我们要在 666 上限制默认的文件创建权限呢?

Jos*_* R. 11

据我所知,这是硬编码到标准实用程序中。我stracetouch创建了一个新文件,又mkdir创建了一个新目录。

touch跟踪生产这样的:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
Run Code Online (Sandbox Code Playgroud)

虽然mkdir跟踪产生了这个:

mkdir("newdir", 0777)                   = 0
Run Code Online (Sandbox Code Playgroud)

缺少用 C 编写文件/目录创建过程的代码,我看不到修改默认权限的方法。不过,在我看来,默认情况下不使文件可执行是有道理的:您不希望任何随机文本被意外地误解为 shell 命令。

更新

举例说明如何将权限位硬编码到标准实用程序中。以下是在两个文件中的一些相关线路coreutils包含两个源代码包touch(1)mkdir(1),其中包括:

mkdir.c

if (specified_mode)
   {   
     struct mode_change *change = mode_compile (specified_mode);
     if (!change)
       error (EXIT_FAILURE, 0, _("invalid mode %s"),
              quote (specified_mode));
     options.mode = mode_adjust (S_IRWXUGO, true, umask_value, change,
                                  &options.mode_bits);
     free (change);
   }   
  else
    options.mode = S_IRWXUGO & ~umask_value;
}   
Run Code Online (Sandbox Code Playgroud)

换句话说,如果未指定模式,则将其设置为S_IRWXUGO(read: 0777) 由umask_value.

touch.c 更清晰:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
Run Code Online (Sandbox Code Playgroud)

也就是说,给每个人读和写权限(读取:0666),当然,这将被umask文件创建过程修改。

您可能只能以编程方式解决这个问题:即,在从 C 程序中创建文件时,您可以直接进行系统调用,或者从允许您进行低级系统调用的语言中创建文件(例如,参见 Perlsysopen下的perldoc -f sysopen)。


Ada*_*hon 7

首先,没有全局默认值,权限取决于创建文件的应用程序。例如,如果 umask 为 0000,这个小 C 程序将创建一个权限为 0777 的文件“/tmp/foo”(在任何情况下,权限都是 0777 & ~umask):

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

话虽如此,许多应用程序创建的文件权限为 0666。这有两个原因:

  1. 安全性:您不希望任何任意文件可执行。
  2. 方便:大多数文件不需要可执行。在选定的几个文件上设置可执行位比在大量其他文件上取消设置更容易。当然,umask 0133 可以解决这个问题,但是没有任何好处,即使您愿意,也不能让程序创建可执行文件。