将多个组设置为目录所有者

将多个组设置为目录所有者

在我的服务器上我有目录/srv/svn

是否可以将此目录设置为具有多个组所有权,例如devFirmAdevFirmBdevFirmC

重点是我想要subversion版本控制管理跨多个存储库的多个用户,但我不知道如何合并 /srv/svn,存储库的根目录,权限。例如,我有三个公司,FirmAFirmBFirmC。现在,在里面/srv/svn我创建了三个目录,FirmAFirmBFirmC并且在其中我为每个项目创建了存储库,现在我不知道如何建立权限方案,因为里面的所有元素/srv/svn都由 拥有root:root,这是不行的,或者我是吗?错误的?

答案1

您只能拥有一组所有者

然而使用访问控制列表您可以为其他组定义权限。

检查您是否安装了 ACL,发出命令getfacl。如果您的系统尚未安装 ACL,请安装命令行工具,该工具位于acl包裹和:sudo apt-get install acl

getfacl您可以读取目录或其他文件的ACL信息,并使用setfacl您可以将组添加到文件中。

例如:

setfacl -m g:devFirmB:rwx /srv/svn/  

devFirmB添加组r头,w仪式,eX对目录执行权限/srv/svn

如果您还希望在该目录中创建的文件由多个组拥有,请将 ACL 设置为默认 ACL。默认组条目中的X表示“如果所有者(或其他任何人)可执行,则允许执行”。

setfacl -m g:devFirmB:rwx /srv/svn/  
setfacl -d -m g:devFirmB:rwX /srv/svn/  

答案2

这是一个极其常见的问题,如果我理解准确的话,我经常会遇到它。如果我使用 ACL 来解决每个琐碎的分组问题,我将拥有大量难以管理的系统。当你无法以任何其他方式做到这一点时,他们正在使用最佳实践,而不是针对这种情况。这是我非常强烈推荐的方法。

首先,您需要将 umask 设置为 002,这样群组就可以与自己共享。我通常创建一个类似 的文件/etc/profile.d/firm.sh,然后使用 umask 添加测试命令。

[ $UID -gt 10000 ] && umask 002

接下来您需要将目录设置为各自的组,

chgrp -R FirmA /srv/svn/FirmA 
chgrp -R FirmB /srv/svn/FirmB
chgrp -R FirmC /srv/svn/FirmC

最后,您需要正确设置 SGID 位,以便该组将始终保持您设置的值。这将防止写入的文件被设置为写入者的 GID。

find /srv/svn/FirmA -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmB -type d -print0 | xargs -0 chmod 2775
find /srv/svn/FirmC -type d -print0 | xargs -0 chmod 2775

find /srv/svn/FirmA -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmB -type f -print0 | xargs -0 chmod 664
find /srv/svn/FirmC -type f -print0 | xargs -0 chmod 664

现在,如果您想防止其他用户访问这些目录,请执行以下操作。

chmod 2770 /srv/svn/FirmA
chmod 2770 /srv/svn/FirmB
chmod 2770 /srv/svn/FirmC

答案3

一个文件不可能被多个具有传统 Unix 权限的 Linux 组所拥有。 (然而,可以用ACL.)

但您可以使用以下解决方法并创建一个新组(例如称为devFirms),其中将包括该组的所有用户devFirmAdevFirmBdevFirmC
您可以使用以下命令创建新用户组:

sudo addgroup NEWGROUPNAME

首先,您可能必须安装id-utils才能获取lid- 命令:

sudo apt-get install id-utils

然后您可以运行以下代码行轻松将所有用户复制SOURCEGROUPTARGETGROUP。当然,您必须为要复制的每个组运行一次​​该命令。不要忘记将大写的占位符替换为实际的组名称。

for u in $(lid -g -n SOURCEGROUP); do sudo usermod -a -G TARGETGROUP $u; done

因此,在您的情况下,您必须运行命令(一次运行所有行):

sudo addgroup devFirms &&
for u in $(lid -g -n devFirmA); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmB); do sudo usermod -a -G devFirms $u; done &&
for u in $(lid -g -n devFirmC); do sudo usermod -a -G devFirms $u; done

请注意,这些命令仅复制所有用户当前的源组的成员。稍后添加的每个用户还必须使用该adduser命令手动添加到您的公共组中。只需再次将大写的占位符替换为实际的用户和组名称 ( devFirms):

sudo adduser NEWUSER TARGETGROUP

谢谢贾斯汀·埃蒂尔他的回答在Unix&Linux.SE:将一个组的所有用户添加到另一个组?

答案4

为了向多个组或用户提供不同的权限,请使用以下命令(在 RHEL 6 和 7 上测试):

要成为组的新所有者:

setfacl -m g:<group_name>:<rights you want to give eg.rwx> -R <directory_name>

要检查当前的 acl 设置:

getfacl <directory_name>

相关内容