据我发现,使用 umask 时,您可以授予文件的最高权限是 666。这是由umask 0000
.这是因为默认的文件创建权限,在我所知道的每个系统上似乎都是 666。
我知道对于文件,我们需要可执行权限来显示其内容。
但为什么我们要限制 666 上的默认文件创建权限呢?
答案1
据我所知,这是硬编码到标准实用程序中的。我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
为由umask_value
.
touch.c
就更清楚了:
int default_permissions =
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
也就是说,赋予每个人读写权限(读:0666),umask
当然,该权限会被文件创建过程修改。
您也许只能通过编程方式解决这个问题:即,在从 C 程序中创建文件时,您可以直接进行系统调用,或者从允许您进行低级系统调用的语言中创建文件(例如,请参阅 Perl 下的示例sysopen
)perldoc -f sysopen
)。
答案2
首先,没有全局默认值,权限取决于创建文件的应用程序。例如,如果 umask 为 0000,这个小 C 程序将创建一个权限为 0777 的文件“/tmp/foo”(在任何情况下权限都将为 0777 & ~umask):
int main()
{
creat("/tmp/foo", 0777);
return 0;
}
话虽这么说,许多应用程序创建的文件的权限为 0666。这有两个原因:
- 安全性:您不希望任何任意文件都是可执行的。
- 方便:大多数文件不需要可执行。在选定的几个文件上设置可执行位比在大量其他文件上取消设置要容易得多。当然,umask 0133 可以解决这个问题,但是这样就什么也得不到了,即使你愿意,你也不能让程序创建可执行文件。