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 checkout和git 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)
如果要对现有文件夹执行此操作,则需要确保还为所有子文件夹启用了 setgid 位。但是,您不需要在文件上使用它,而且您可能也不希望在文件上使用它。以下是如何为所有子文件夹递归设置它。
find /path/to/base/dir -type d -exec chmod g+s {} +
Run Code Online (Sandbox Code Playgroud)
我无法找到源代码,但使用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标志并在下面处理现有文件和新文件的组权限,因此您永远不需要再次使用umask或chgrp。
如果我找到它,我会将来源放在评论中。