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


12

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

drwxr-s---. user group folder

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

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

-rw-r--r--. user group foo.txt
-rw-rw-r--. user group bar.txt

我在期待-rw-r-----. user group。如何获得对组的额外写许可和对其他人的读许可?

Answers:


16

setguid

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

drwxr-s---. user group folder

s是该行开头的字符包中的。因此将它们分组:

d - directory
rwx - read/write/execute bits for user
r-s - read/execute/setuid bits for group
--- - nothing for other users

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

这是什么原因造成的文件foo.txtbar.txt要像这样创建的:

-rw-r--r--. user group foo.txt
-rw-rw-r--. user group bar.txt

权限和umask

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

$ umask
0002

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

这是一个掩码,因此它将禁用与启用的权限相关的任何位。在此示例中,我要删除的唯一内容是其他对象的写权限。

0 - skipping for this conversation
0 - value of user bits
0 - value of group bits
2 - value of other bits

该命令中“位”的表示形式为十进制形式。因此2等于二进制形式的010,即写入位。4(100)表示您希望禁用阅读功能。7(111)表示您希望读/写/执行所有禁用的功能。从这里构建:

$ umask 007

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

那么您的文件呢?

好了,该规则umask控制着在创建新文件时将要设置的权限。因此,如果我们有以下umask设置:

$ umask 007

并开始处理新文件,我们将看到它们像这样创建:

$ 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

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

$ 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

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

$ 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

那么文件浏览器怎么了?

umask就是我所谓的“软”设置。它绝不是绝对的,并且可以通过多种方式在Unix中轻松地绕开。许多工具都带有开关,这些开关允许您在操作中指定权限。

就拿mkdir例如:

$ umask
0037

$ mkdir -m 777 somedir1
$

$ ls -ld somedir1
drwxrwxrwx 2 saml saml 4096 Nov  3 22:44 somedir1

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

其他方法?只需覆盖即可umask。文件浏览器很可能会执行此操作,或者只是完全忽略了umask并使用其配置为执行的任何权限放下文件。


我以为umask应该删除特权,而不是添加特权。还是我错过了什么?
问题溢流时间

@QuestionOverflow-您掩码控制创建文件和目录时允许的权限。因此,它的名字。它掩盖了在创建过程中不使用的位。
slm

我的umask读到0002。如果umask确实设置了权限而不是删除权限,那么当我这样做时touch,将同时为用户和组设置执行位,但事实并非如此。
问题溢流时间

@QuestionOverflow-这是touch命令的限制。见我在A.包含此链接的链接:unix.stackexchange.com/questions/47178/...
SLM

仅基于注释来澄清几点:1)新文件的权限始终由umask +用于创建文件的程序确定,2)权限永远不会从父目录继承。
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.