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

Ker*_*nic 42 permissions subversion group

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

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

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

jcb*_*rmu 34

您只能拥有一个群组作为所有者

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

检查您是否安装了发出命令的 ACL getfacl。如果您的系统没有安装ACL,安装的命令行工具,是在acl包装用:sudo apt-get install acl

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

例如:

setfacl -m g:devFirmB:rwx /srv/svn/  
Run Code Online (Sandbox Code Playgroud)

附加组devFirmB[R EAD,w ^仪式,电子X ecute权限目录/srv/svn

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

setfacl -m g:devFirmB:rwx /srv/svn/  
setfacl -d -m g:devFirmB:rwX /srv/svn/  
Run Code Online (Sandbox Code Playgroud)


J. *_*ker 20

这是一个非常普遍的问题,如果我理解准确的话,我会经常遇到它。如果我对每个琐碎的分组问题都使用 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
Run Code Online (Sandbox Code Playgroud)

最后,您需要正确设置 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
Run Code Online (Sandbox Code Playgroud)

最后,如果您想阻止其他用户访问目录。

chmod 2770 /srv/svn/FirmA
chmod 2770 /srv/svn/FirmB
chmod 2770 /srv/svn/FirmC
Run Code Online (Sandbox Code Playgroud)

  • 警告:这应该可以工作,但会删除所有文件的执行权限位。如果您的目录树只包含文档,这没问题。如果它包含可执行文件,这将阻止执行,这可能会破坏您的设置。 (3认同)

Byt*_*der 6

具有传统 Unix 权限的多个 Linux 组不可能拥有一个文件。(但是,可以使用 ACL。)

但是您可以使用以下解决方法并创建一个新组(例如称为devFirms),该组将包括该组的所有用户devFirmAdevFirmB以及devFirmC
您创建新的用户组:

sudo addgroup NEWGROUPNAME
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get install id-utils
Run Code Online (Sandbox Code Playgroud)

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

for u in $(lid -g -n SOURCEGROUP); do sudo usermod -a -G TARGETGROUP $u; done
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

sudo adduser NEWUSER TARGETGROUP
Run Code Online (Sandbox Code Playgroud)

感谢Justin EthierUnix&Linux.SE 的回答:将一个组的所有用户添加到另一个组?