文件权限如何应用于新创建的文件?

Que*_*low 14 permissions

我有一个设置了以下权限的目录:

drwxr-s---. user group folder
Run Code Online (Sandbox Code Playgroud)

在桌面上,我访问此文件夹并右键单击以创建一个新文件 call foo.txt. 然后使用终端,我使用命令创建了另一个文件$ touch bar.txt

当我检查这些文件的权限时,我有:

-rw-r--r--. user group foo.txt
-rw-rw-r--. user group bar.txt
Run Code Online (Sandbox Code Playgroud)

我很期待-rw-r-----. user group。组的额外写权限和其他人的读权限是如何产生的?

slm*_*slm 18

设置向导

这里有两种力量在起作用。第一个是文件夹上启用的 setgid 位,folder.

drwxr-s---. user group folder
Run Code Online (Sandbox Code Playgroud)

这就是s这一行开头的字符包。他们是这样分组的:

d - directory
rwx - read/write/execute bits for user
r-s - read/execute/setuid bits for group
--- - nothing for other users
Run Code Online (Sandbox Code Playgroud)

r-s意味着在此文件夹内创建的任何文件或目录都将自动将组设置为组group

这就是导致文件foo.txtbar.txt像这样创建的原因:

-rw-r--r--. user group foo.txt
-rw-rw-r--. user group bar.txt
Run Code Online (Sandbox Code Playgroud)

权限和 umask

您看到的权限是另一回事。这些由您的umask. 您可以umask使用以下命令查看您的设置umask

$ umask
0002
Run Code Online (Sandbox Code Playgroud)

注意:这些位也称为“模式”位。

这是一个掩码,因此它将禁用与启用的权限相关的任何位。在这个例子中,我唯一想要关闭的是其他人的写权限。

0 - skipping for this conversation
0 - value of user bits
0 - value of group bits
2 - value of other bits
Run Code Online (Sandbox Code Playgroud)

此命令中“位”的表示采用十进制形式。所以a 2 等于二进制形式的010,也就是写位。4 (100) 表示您希望禁用读取。A 7 (111) 表示您希望读/写/执行全部禁用。从这里构建它:

$ umask 007
Run Code Online (Sandbox Code Playgroud)

将禁用其他用户的读/写/执行位。

那么你的文件呢?

那么umask管理将在创建新文件时设置的权限。因此,如果我们有以下umask设置:

$ umask 007
Run Code Online (Sandbox Code Playgroud)

并开始接触新文件,我们会看到它们是这样创建的:

$ touch newfile1.txt newfile2.txt
$ ls -l |grep newfile
-rw-rw----   1 saml saml        0 Nov  3 22:34 newfile1.txt
-rw-rw----   1 saml saml        0 Nov  3 22:34 newfile2.txt
Run Code Online (Sandbox Code Playgroud)

如果我们将其更改为其他内容,请说:

$ umask 037
$ ls -l |grep newfile
-rw-rw----   1 saml saml        0 Nov  3 22:36 newfile1.txt
-rw-rw----   1 saml saml        0 Nov  3 22:36 newfile2.txt
-rw-r-----   1 saml saml        0 Nov  3 22:35 newfile3.txt
-rw-r-----   1 saml saml        0 Nov  3 22:35 newfile4.txt
Run Code Online (Sandbox Code Playgroud)

不过,它不会对我们已经创建的文件产生任何影响。看这里:

$ umask
0037
$ touch newfile1.txt newfile2.txt
$ ls -l | grep newfile
-rw-rw----   1 saml saml        0 Nov  3 22:37 newfile1.txt
-rw-rw----   1 saml saml        0 Nov  3 22:37 newfile2.txt
-rw-r-----   1 saml saml        0 Nov  3 22:35 newfile3.txt
-rw-r-----   1 saml saml        0 Nov  3 22:35 newfile4.txt
Run Code Online (Sandbox Code Playgroud)

那么文件浏览器发生了什么?

umask就是我所说的“软”设置。它绝不是绝对的,可以通过多种方式在 Unix 中很容易地绕过。许多工具都带有开关,允许您指定权限作为其操作的一部分。

就拿mkdir例如:

$ umask
0037

$ mkdir -m 777 somedir1
$

$ ls -ld somedir1
drwxrwxrwx 2 saml saml 4096 Nov  3 22:44 somedir1
Run Code Online (Sandbox Code Playgroud)

使用-m开关,我们可以覆盖umask. 该touch命令没有此功能,因此您必须发挥创造力。请参阅此 U&L 问答,标题为:能否使用在命令行上设置的权限创建文件?对于这样的方法。

其他方法?只需覆盖umask. 文件浏览器很可能要么执行此操作,要么umask使用它配置为执行的任何权限完全忽略并放置文件。