指定特定目录中新文件的默认组和权限


15

我有一个特定的目录,其中有一个由多个用户共享的项目。这些用户使用SSH来访问此目录并修改/创建文件。

该项目仅应可写给特定的用户组:让我们称之为“ mygroup”。在SSH会话期间,默认情况下,当前用户创建的所有文件/目录都应归组“ mygroup”所有,并具有组可写权限。

我可以解决权限问题umask

$ cd project
$ umask 002
$ touch test.txt

文件“ test.txt”现在可以组写入了,但是仍然属于我的默认组(“ mislav”,与我的用户名相同),而不属于“ mygroup”。我可以chgrp递归地设置所需的组,但是我想知道是否有一种隐式设置组的方法,例如umask在会话期间更改默认权限。

这种特定的目录是一个共享的git仓库与工作副本,我想git checkoutgit reset操作设置工作副本中创建的新文件正确的面具和组。操作系统是Ubuntu Linux。

更新:一位同事建议我应该研究POSIX ACL的 getfacl / setfacl,但是umask 002在当前会话中结合使用以下解决方案对我来说已经足够好了,并且更加简单。

Answers:


19

为了使给定目录下的所有文件继承组权限,您需要在目录上使用setgid位。请参阅此链接

 $ mkdir test
 $ sudo chown raphink.staff test
 $ ls -lhd test
     drwxr-xr-x 2 raphink staff 4.0K 2009-12-21 16:19 test
 $ sudo chmod g+s test # Set the setgid bit
 $ ls -lhd test
     drwxr-sr-x 2 raphink staff 4.0K 2009-12-21 16:21 test
 $ touch test/foo
 $ ls -lh test
     total 0
     -rw-r--r-- 1 raphink staff 0 2009-12-21 16:23 foo

谢谢。有趣的是我没有通过谷歌搜索找到它
mislav

6

如果要使用现有文件夹执行此操作,则需要确保同时为所有子文件夹启用setgid位。但是,您不需要文件上的文件,也可能不需要文件上的文件。这是为所有子文件夹递归设置的方法。

find /path/to/base/dir -type d -exec chmod g+s {} +

4

我找不到源,但是setgid用于解决裸git存储库的此问题(我认为是您的情况)已被弃用,在某些情况下可能导致问题。

Git可以通过core.sharedRepository标志来处理所有这一切。我遇到了同样的问题,并按以下方式解决了它:

假设repogroup是您的组,则必须cd进入repo目录:

首先将共享标志更改为group

git config core.sharedRepository group 

注意:此处必须使用关键字group,而不是组名。这等效于使用option创建裸仓库--shared=group

然后更改整个存储库的组:

chgrp -R repogroup .

为确保现有目录可成组写入(g+w),并且现有可执行文件也变为可成组执行(g+X),您还需要:

chmod -R g+wX .

完成此操作后,git将兑现该shared=group标志并在以下内容中照顾现有和新文件的组权限,因此您无需再使用umaskchgrp

如果找到它,我将在评论中注明来源。



1

如果不使用ACL,则很难在Linux / UNIX中继承父目录权限。但是有一种方法可以分配默认文件权限,请检查下面的链接

您可以继承父目录权限吗?

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.