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


12

如我所知,使用umask时,您可以赋予文件的最高权限是666 umask 0000。这是由于默认的文件创建权限,在我所知道的每个系统上似乎都是666。

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


什么样的系统?唯一umask我遇到总是0022创建默认权限644
manatwork

不,你误会了。Umask使用的默认文件权限为666,并减去其自己的值(对于您的系统为0022)。因此,您可以设置的最大权限是umask 0000-仍然限制为666的文件权限。(但显然文件夹使用777)
Peter

知道了 现在,这是一个好问题。
manatwork

2
您不需要可执行权限即可查看文件内容。对于目录来说就是这样,这就是为什么默认情况下使用执行权限创建目录的原因。
Joseph R.

1
我相信[但需要更多地确认]这是设计使然,以避免某些安全问题:如果无法访问“ chmod”,则无法使文件可执行。umask 0000使用0666创建文件,使用0777创建目录(顺便说一句,这是一个非常糟糕的默认设置,明智的做法!)
Olivier Dulac

Answers:


10

据我所知,这是硬编码到标准实用程序中的。我将strace同时touch创建一个新文件和mkdir一个新目录。

touch跟踪生产这样的:

open("newfile", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3

mkdir跟踪结果是这样的:

mkdir("newdir", 0777)                   = 0

缺少用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;
}   

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

touch.c 更清晰:

int default_permissions =
  S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;

也就是说,向所有人授予读取和写入权限(读取:0666),这当然会umask在文件创建过程中被修改。

您可能能够解决这个程序只是:即同时从任一个C程序,在那里你直接或从一种语言,可以让你做一个低级别的系统调用内使系统调用中创建的文件(见例如Perl的sysopenperldoc -f sysopen)。


没错,我不希望发生任何意外。但是没有办法改变它,太可怕了!标准值应该是777,我们需要umask fileumask dir。设置两个不同的默认值并确定。但是现在我无法用exec权限创建文件。
彼得

1
@PeterI好吧,mkdir(1)确实为您提供了一个-m在创建时指定目录模式的开关。但是,对于文件,由于文件创建使用open(2)syscall,因此用于创建文件的工具是负责将模式位传递到的工具open,您对此一无所知。install(1)默认情况下,将文件复制到新位置并设置执行位,但这在创建时仍然没有发生。
Joseph R.

您所说的是touch例如负责设置正确的值。您知道它存储值的位置吗?也许它们是在系统范围内设置的-因此我们可以对其进行更改?因为我想挣脱;)
彼得

@PeterI查看最新答案。
Joseph R.

1
@PeterI我再次更新了答案。您也许可以直接使用C或其他语言(如Perl)进行syscall。
Joseph R.

6

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

int main() 
{
   creat("/tmp/foo", 0777);
   return 0;
}

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

  1. 安全性:您不希望任何任意文件可执行。
  2. 便利性:大多数文件不需要可执行。在少数几个文件上设置可执行位要比在其他文件上取消设置更容易。当然,umask 0133可以解决此问题,但是什么也不会解决,即使您愿意,也无法让程序创建可执行文件。

1
出于安全原因,创建文件时未设置x(execute)位。文件[cw]的无意执行将是“错误的事情”(tm)。chmod程序使您能够根据需要(重新)设置权限位。
ChuckCottrill 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.