Pet*_*ter 14 filesystems permissions files
正如我发现的那样,在使用 umask 时,您可以授予文件的最高权限是 666。这是由umask 0000. 这是因为默认文件创建权限在我知道的每个系统上似乎都是 666。
我知道对于文件,我们需要可执行权限来显示其内容。
但是为什么我们要在 666 上限制默认的文件创建权限呢?
Jos*_* R. 11
据我所知,这是硬编码到标准实用程序中。我strace既touch创建了一个新文件,又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)。
首先,没有全局默认值,权限取决于创建文件的应用程序。例如,如果 umask 为 0000,这个小 C 程序将创建一个权限为 0777 的文件“/tmp/foo”(在任何情况下,权限都是 0777 & ~umask):
int main()
{
creat("/tmp/foo", 0777);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
话虽如此,许多应用程序创建的文件权限为 0666。这有两个原因: