在 CentOS 6 上,如何让用户创建的文件从其父目录继承权限?

在 CentOS 6 上,如何让用户创建的文件从其父目录继承权限?

所以我们的服务器设置如下:
文件夹结构

/asic是我们大项目的文件夹,/200T是该大项目的子项目,而正下方的文件夹/200T例如/lbh是每个在子项目上工作的工作人员的个人目录。/asic/200T/lbh都是由rootroot 通过 和 创建的,然后由 root 重新配置它们的属性。和chmod -R分别由和组拥有并属于它们,而由工作人员的用户帐户拥有并属于组。chown -R/asic/200Trootasic200T/lbhlbhasic

这个想法是,所有从事 和 的人员都可以看到/asic其中的内容,但他们无法对这两个目录具有写入权限——如果他们想要创建某些内容,他们必须在自己的目录中进行创建(等等)。当一名工作人员在自己的目录中创建某些内容时,我们希望同一子项目的其他工作人员能够读取该新内容,但不会意外修改它。例如,刚刚在 下创建了一个文件和一个文件夹。子项目中的另一个人()应该能够读取但不能写入它们。如果想修改它们,他必须将它们复制到自己的目录中,然后进行修改。/200Tasic200T/lbhlbhtestbench.v/results/asic/200T/lbhglj200T/asic/200T/lbh/testbench.v/asic/200T/lbh/resultsglj/asic/200T/glj

为了达到上述目的,我们需要创建的目录的权限lbh默认为drwxr-s---,文件的权限rwxr-s---默认为,然而实际情况是这样的:
lbh 和 root 创建的文件和文件夹

导致每个工作人员都能够写入每个人自己的文件夹和文件,这正是我们试图避免的。 的umaskroot0022umask普通用户的 是0002

我的问题:

  1. /lbh为什么用户(如)在其个人目录(如lbh)下创建的文件会忽略drwxr-s--- 个人文件夹的权限并默认为 (d)rwxrwsr-x
  2. 有没有安全的方法让员工默认使用 (d)rwxr-s--- 创建文件和文件夹? chmod每次都要求每个用户手动操作太麻烦了,而且我担心更改默认umask值会导致新的意外问题。

多谢!


编辑:lbh 和 root 创建的文件的文件夹结构和权限如下所示:

[lbh@<machine> lbh]$ ls -al
total 16
drwxr-s---. 4 lbh  200T 4096 Oct  1 02:40 .
drwxr-sr-x. 4 root 200T 4096 Oct  1 02:18 ..
drwxrwsr-x. 2 lbh  200T 4096 Oct  1 02:26 aaa_lbh
drwxr-sr-x. 2 root 200T 4096 Oct  1 02:26 aaa_root
-rw-rw-r--. 1 lbh  200T    0 Oct  1 02:38 file_lbh.txt
-rw-r--r--. 1 root 200T    0 Oct  1 02:40 file_root.txt
[lbh@<machine> lbh]$ pwd
/asic/200T/lbh
[lbh@<machine> lbh]$ cd ..
[lbh@<machine> 200T]$ ls -al
total 16
drwxr-sr-x. 4 root 200T 4096 Oct  1 02:18 .
drwxr-x---. 3 root asic 4096 Oct  1 02:16 ..
drwxr-sr-x. 2 root 200T 4096 Oct  1 02:18 aaa
drwxr-s---. 4 lbh  200T 4096 Oct  1 02:40 lbh
[lbh@<machine> 200T]$ pwd
/asic/200T
[lbh@<machine> 200T]$ 

目录和文件结果getfacl如下:

[lbh@<machine> Desktop]$ getfacl /asic
getfacl: Removing leading '/' from absolute path names
# file: asic
# owner: root
# group: asic
user::rwx
group::r-x
other::---

[lbh@<machine> Desktop]$ getfacl /asic/200T/
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/
# owner: root
# group: 200T
# flags: -s-
user::rwx
group::r-x
other::r-x

[lbh@<machine> Desktop]$ getfacl /asic/200T/lbh
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh
# owner: lbh
# group: 200T
# flags: -s-
user::rwx
group::r-x
other::---

[lbh@<machine> Desktop]$ getfacl /asic/200T/lbh/aaa_lbh/
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh/aaa_lbh/
# owner: lbh
# group: 200T
# flags: -s-
user::rwx
group::rwx
other::r-x

[lbh@<machine> Desktop]$ getfacl /asic/200T/lbh/aaa_root/
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh/aaa_root/
# owner: root
# group: 200T
# flags: -s-
user::rwx
group::r-x
other::r-x

[lbh@<machine> Desktop]$ getfacl /asic/200T/lbh/file_lbh.txt 
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh/file_lbh.txt
# owner: lbh
# group: 200T
user::rw-
group::rw-
other::r--

[lbh@<machine> Desktop]$ getfacl /asic/200T/lbh/file_root.txt 
getfacl: Removing leading '/' from absolute path names
# file: asic/200T/lbh/file_root.txt
# owner: root
# group: 200T
user::rw-
group::r--
other::r--

[lbh@<machine> Desktop]$ touch hello.txt
[lbh@<machine> Desktop]$ mkdir hi 
[lbh@<machine> Desktop]$ ls -al
total 12
drwxr-xr-x.  3 lbh lbh 4096 Oct  9 17:28 .
drwx------. 36 lbh lbh 4096 Oct  9 17:21 ..
-rw-rw-r--.  1 lbh lbh    0 Oct  9 17:27 hello.txt
drwxrwxr-x.  2 lbh lbh 4096 Oct  9 17:28 hi
[lbh@<machine> Desktop]$ getfacl hi
# file: hi
# owner: lbh
# group: lbh
user::rwx
group::rwx
other::r-x

[lbh@<machine> Desktop]$ getfacl hello.txt 
# file: hello.txt
# owner: lbh
# group: lbh
user::rw-
group::rw-
other::r--

[lbh@<machine> Desktop]$ 

答案1

Linux 不支持权限继承,因此您无法执行问题主题中所要求的操作。

你能做的最好的就是设置默认 POSIX ACL这将适用于所有新创建的文件和目录。这不是继承,只是默认的:

setfacl -m default:user:<username>:rwx <dir>
setfacl -m default:group:<groupname>:rwx <dir>

此后,如果有人在 中创建文件或目录(当然,如果他们被允许在那里创建对象),该对象将获得额外的 ACLuser:<username>:rwx和。您可以通过将和设置为空白来group:<groupname>:rwx设置所有者和组所有者的默认权限。<username><groupname>

此“默认”只能在目录上设置,因为将其应用于文件毫无意义。以这种方式设置的权限也会被 umask 屏蔽,因此如果在 umask 中删除了某个位,则该位将从权限中删除。例如,当您创建文件时,如果您不为其提供可执行位,则不会将其设置为可执行(如预期的那样)。创建的子目录也将设置相同的“默认”ACL,因此其后代也将设置这些 ACL。您必须在创建后删除或更改子目录上的 ACL 才能停止此传播。

使用 检查 ACL getfacl <dir>。当然,可能会有多个这样的默认值(并且似乎最终会得到多条规则);至少,我遇到的要求总是要求至少有两个默认组 ACL。


不能以这种方式设置“默认文件所有者”,所有者将始终设置为创建进程有效 uid。默认情况下,组所有者将设置为进程 gid,但您可以使用设置组ID父目录上的位:

    chmod g+s <dir>

此后,在该目录中创建的任何对象都将默认复制其组所有者,即使创建者不属于该组。此 setgit 位会传播到子目录。

所有者可以将组所有者设置为他们所属的任何组。如果他们不属于 setgid 派生的组,他们可以将文件组所有者更改为他们所属的任何组,但此后他们将无法将其更改回 setgid 值。


我想再次明确指出,这是不是继承,这是设置默认值,并不完全相同。如果您之后对父对象进行某些更改,则已创建的对象将始终保留其在 Linux 中的权限。

而例如在 Windows 中,当你将子对象 ACL 设置为“继承”时,更改父 ACL 将影响后代,这是正确的继承。

相关内容