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


31

在我的服务器上,我有directory /srv/svn

是否有可能这个目录有多个组所有权,例如设置devFirmAdevFirmBdevFirmC

关键是,我想通过subversion版本控制来管理跨多个存储库的多个用户,并且我不知道如何合并 /srv/svn(存储库的根目录,权限)。例如,我有三个公司FirmAFirmBFirmC。现在,里面/srv/svn我已经创建了三个目录,FirmAFirmBFirmC和在他们里面我已经创建库对每一个项目,现在我不知道如何建立许可计划,因为所有elementes内/srv/svn由所有的root:root,这也不行,还是我错误?


1
公司组是否互相访问文件?还是除了共享父目录外,它们是否完全分开?
JM Becker 2015年

@TechZilla公司组务必不要访问彼此的文件,必须将它们分开,只有我必须有权访问所有目录。
KernelPanic 2015年

好的,我发布了正确的答案,您不应为此使用ACL。它们是不得已的选择,这个问题仍然是非常普遍的。
JM Becker

Answers:


16

如果我准确地理解它,并且不断遇到,这是一个非常普遍的问题。如果我将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

2
警告:这应该可以,但是会删除所有文件的执行许可权。如果您的目录树仅包含文档,则可以。如果它包含可执行文件,则将阻止执行,这可能会破坏您的设置。
斯特凡纳·古里科

1
这可能也是一个好主意,但根本无法回答问题。
ceving

如前所述,这仅对三个文件夹进行了分区,因此,每个公司的成员只能修改其各自的文件-它不会为“ svn”提供所需的访问权限。
rich p

不过,这非常接近。缺少的是让可以访问所有组。假设您的登录名是svnadmin: 添加此步骤,sudo usermod -a -G FirmA,FirmB,FirmC svnadmin 这将添加svnadmin到所有这些组。由于所有这些组中的文件都启用了“组写入”功能(执行chmod 664此操作),因此,加上firmX,您将是firmX拥有的唯一文件写入器。
rich p

1
更好-更改权限以添加/减去您想添加/减去的内容-例如,做find /srv/svn/FirmA -type f -print0 | xargs -0 chmod ug+rw,o+r,o-wx
丰富

25

您只能将一个组作为所有者

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

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

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

例如:

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

添加组devFirmB[R EAD,瓦特仪式,电子X ecute权限目录/srv/svn

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

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

6

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

但是您可以使用以下变通办法并创建一个新的组(例如devFirms),其中将包括该组的所有用户devFirmAdevFirmB以及devFirmC
您可以通过以下方式创建新的用户组:

sudo addgroup NEWGROUPNAME

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

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

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


@Gilles,您认为您的方案适用于Subversion服务器具有多个用户的多个存储库吗?
KernelPanic 2015年

2

不,这是不可能的。

每个文件(目录也是如此)只能有一个用户和一组。


6
提供一种替代方法以获得相同或相似的结果会很好。
Byte Commander'Apr

2

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

成为群组的新所有者:

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

要检查当前的ACL设置:

getfacl <directory_name>

经过测试,也可以在Ubuntu 16.04.3上工作
Dmitry
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.