为某个目录中的新文件指定默认组和权限

mis*_*lav 16 unix permissions posix umask chgrp

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

这个项目应该只对特定的用户组是可写的:我们称之为“mygroup”。在 SSH 会话期间,当前用户创建的所有文件/目录默认应归组“mygroup”所有,并具有组可写权限。

我可以解决权限问题umask

$ cd project
$ umask 002
$ touch test.txt
Run Code Online (Sandbox Code Playgroud)

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

这个特定目录是一个带有工作副本的共享 git 存储库,我希望git checkoutgit reset操作为在工作副本中创建的新文件设置正确的掩码和组。操作系统是 Ubuntu Linux。

更新:一位同事建议我应该查看POSIX ACL 的getfacl/setfacl,但下面结合umask 002当前会话中的解决方案对我来说已经足够了,而且要简单得多。

rap*_*ink 20

为了让给定目录下的所有文件都继承组权限,您需要在您的目录中使用 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
Run Code Online (Sandbox Code Playgroud)


and*_*ber 6

如果要对现有文件夹执行此操作,则需要确保还为所有子文件夹启用了 setgid 位。但是,您不需要在文件上使用它,而且您可能也不希望在文件上使用它。以下是如何为所有子文件夹递归设置它。

find /path/to/base/dir -type d -exec chmod g+s {} +
Run Code Online (Sandbox Code Playgroud)


ggl*_*gll 6

我无法找到源代码,但使用setgid裸 git 存储库来解决此问题(我认为这是您的情况)已被弃用,并且在某些情况下可能会导致问题。

Git 可以通过标志来处理这一切core.sharedRepository。我有同样的问题并解决如下:

假设repogroup是你的组,并且你必须cd到 repo 目录:

首先将共享标志更改为group

git config core.sharedRepository group 
Run Code Online (Sandbox Code Playgroud)

注意:这里必须使用关键字group,而不是组名。这相当于使用选项创建裸存储库--shared=group

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

chgrp -R repogroup .
Run Code Online (Sandbox Code Playgroud)

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

chmod -R g+wX .
Run Code Online (Sandbox Code Playgroud)

完成此操作后,git 将尊重该shared=group标志并在下面处理现有文件和新文件的组权限,因此您永远不需要再次使用umaskchgrp

如果我找到它,我会将来源放在评论中。