在 Linux 上获取新文件继承组权限

在 Linux 上获取新文件继承组权限

我在 Linux 服务器上遇到权限问题。我已经习惯了 BSD。当目录由某个组拥有时,拥有该目录的用户不在 www-data 中,则在该目录中创建的文件将由该组拥有。这很重要,因为我希望网络服务器可以读取文件(我不会以 root 身份运行),但用户仍然可以将新文件放入目录中。我无法将用户放入 www-data 中,因为这样他们就可以读取其他所有用户的网站。

我希望网络服务器能够读取所有网站,我希望用户能够更改自己的网站。

目前文件夹的权限设置如下......

drwxr-x--- 3 john www-data 4096 Feb 17 21:27 john

权限以这种方式工作是 BSD 上的标准行为。我怎样才能让 Linux 做到这一点?

答案1

听起来你正在描述设置gid位当目录设置了该功能时,将强制在其中创建的任何新文件将其组设置为与父目录上设置的组相同。

例子

$ whoami
saml

$ groups
saml wheel wireshark

设置具有权限+所有权的目录

$ sudo mkdir --mode=u+rwx,g+rs,g-w,o-rwx somedir
$ sudo chown saml.apache somedir
$ ll -d somedir/
drwxr-s---. 2 saml apache 4096 Feb 17 20:10 somedir/

在此目录中以 saml 形式触摸文件

$ whoami
saml

$ touch somedir/afile
$ ll somedir/afile 
-rw-rw-r--. 1 saml apache 0 Feb 17 20:11 somedir/afile

这将为您提供大约您想要的内容。如果您确实想要您所描述的内容,我认为您需要借助访问控制列表功能来获得该功能(ACL)。

ACL

如果您想对目录下创建的文件的权限有更多的控制,somedir您可以添加以下 ACL 规则来设置默认权限,如下所示。

$ ll -d somedir
drwxr-s---. 2 saml apache 4096 Feb 17 20:46 somedir

设置权限

$ sudo setfacl -Rdm g:apache:rx somedir
$ ll -d somedir/
drwxr-s---+ 2 saml apache 4096 Feb 17 20:46 somedir/

请注意+末尾的 ,这意味着该目录已应用 ACL。

$ getfacl somedir
# file: somedir
# owner: saml
# group: apache
# flags: -s-
user::rwx
group::r-x
other::---
default:user::rwx
default:group::r-x
default:group:apache:r-x
default:mask::r-x
default:other::---

$ touch somedir/afile
$ ll somedir/afile 
-rw-r-----+ 1 saml apache 0 Feb 17 21:27 somedir/afile
$ 

$ getfacl somedir/afile
# file: somedir/afile
# owner: saml
# group: apache
user::rw-
group::r-x              #effective:r--
group:apache:r-x        #effective:r--
mask::r--
other::---

请注意,默认权限 ( setfacl -Rdm) 设置为默认 ( ) 权限r-x( g:apache:rx)。这会强制所有新文件仅启用其r位。

答案2

TL:博士;使新的文件继承容器文件夹的组执行以下操作:

$ chmod g+s somefolder

注意:它隐含在接受的答案中,这只是一个片段。

答案3

作为 slm 答案的补充,请注意,在 ext2/3/4 文件系统上,您可以通过bsdgroups在分区上使用 mount 选项来复制您描述的 BSD 行为。从mount(1)手册页:

grpid|bsdgroups and nogrpid|sysvgroups
              These options define what group id a newly  created  file  gets.
              When  grpid  is  set,  it takes the group id of the directory in
              which it is created; otherwise (the default) it takes the  fsgid
              of  the current process, unless the directory has the setgid bit
              set, in which case it takes the gid from the  parent  directory,
              and also gets the setgid bit set if it is a directory itself.

相关内容