所以我们的服务器设置如下:
文件夹结构
/asic
是我们大项目的文件夹,/200T
是该大项目的子项目,而正下方的文件夹/200T
例如/lbh
是每个在子项目上工作的工作人员的个人目录。/asic
,/200T
,/lbh
都是由root
root 通过 和 创建的,然后由 root 重新配置它们的属性。和chmod -R
分别由和组拥有并属于它们,而由工作人员的用户帐户拥有并属于组。chown -R
/asic
/200T
root
asic
200T
/lbh
lbh
asic
这个想法是,所有从事 和 的人员都可以看到/asic
其中的内容,但他们无法对这两个目录具有写入权限——如果他们想要创建某些内容,他们必须在自己的目录中进行创建(等等)。当一名工作人员在自己的目录中创建某些内容时,我们希望同一子项目的其他工作人员能够读取该新内容,但不会意外修改它。例如,刚刚在 下创建了一个文件和一个文件夹。子项目中的另一个人()应该能够读取但不能写入它们。如果想修改它们,他必须将它们复制到自己的目录中,然后进行修改。/200T
asic
200T
/lbh
lbh
testbench.v
/results
/asic/200T/lbh
glj
200T
/asic/200T/lbh/testbench.v
/asic/200T/lbh/results
glj
/asic/200T/glj
为了达到上述目的,我们需要创建的目录的权限lbh
默认为drwxr-s---
,文件的权限rwxr-s---
默认为,然而实际情况是这样的:
lbh 和 root 创建的文件和文件夹
导致每个工作人员都能够写入每个人自己的文件夹和文件,这正是我们试图避免的。 的umask
是root
,0022
而umask
普通用户的 是0002
。
我的问题:
/lbh
为什么用户(如)在其个人目录(如lbh
)下创建的文件会忽略drwxr-s---
个人文件夹的权限并默认为(d)rwxrwsr-x
?- 有没有安全的方法让员工默认使用 (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 将影响后代,这是正确的继承。