在我的服务器上我有目录/srv/svn
。
是否可以将此目录设置为具有多个组所有权,例如devFirmA
、devFirmB
和devFirmC
?
重点是我想要subversion
版本控制管理跨多个存储库的多个用户,但我不知道如何合并 /srv/svn
,存储库的根目录,权限。例如,我有三个公司,FirmA
,FirmB
和FirmC
。现在,在里面/srv/svn
我创建了三个目录,FirmA
,FirmB
,FirmC
并且在其中我为每个项目创建了存储库,现在我不知道如何建立权限方案,因为里面的所有元素/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
),其中将包括该组的所有用户devFirmA
,devFirmB
和devFirmC
。
您可以使用以下命令创建新用户组:
sudo addgroup NEWGROUPNAME
首先,您可能必须安装id-utils
才能获取lid
- 命令:
sudo apt-get install id-utils
然后您可以运行以下代码行轻松将所有用户复制SOURCEGROUP
到TARGETGROUP
。当然,您必须为要复制的每个组运行一次该命令。不要忘记将大写的占位符替换为实际的组名称。
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
答案4
为了向多个组或用户提供不同的权限,请使用以下命令(在 RHEL 6 和 7 上测试):
要成为组的新所有者:
setfacl -m g:<group_name>:<rights you want to give eg.rwx> -R <directory_name>
要检查当前的 acl 设置:
getfacl <directory_name>