我有一个目录,其中有一个由多个用户共享的项目。这些用户使用 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
标志并处理以下组权限,包括现有文件和新文件,因此您不再需要umask
或chgrp
。
如果我找到它,我会在评论中注明来源。
答案4
当谈到 *nix 方面时,我并不是一个专家,但我认为你要找的是 setgid。
看这里。