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

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

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

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

我可以使用以下方法解决权限问题umask

$ cd project
$ umask 002
$ touch test.txt

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

这个特定目录是一个带有工作副本的共享 git repo,我想要通过git checkout操作git reset为在工作副本中创建的新文件设置正确的掩码和组。操作系统是 Ubuntu Linux。

更新:一位同事建议我研究一下 getfacl/setfaclPOSIX ACL但下面结合umask 002当前会话的解决方案对我来说已经足够好了,而且更加简单。

答案1

为了让给定目录下的所有文件继承组权限,您需要对目录使用 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

答案2

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

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

答案3

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

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

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

首先将共享标志更改为group

git config core.sharedRepository group 

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

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

chgrp -R repogroup .

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

chmod -R g+wX .

完成此操作后,git 将尊重该shared=group标志并处理以下组权限,包括现有文件和新文件,因此您不再需要umaskchgrp

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

答案4

当谈到 *nix 方面时,我并不是一个专家,但我认为你要找的是 setgid。

这里

相关内容