我有一个特定的目录,有一个项目由多个用户共享。 这些用户使用SSH访问此目录并修改/创build文件。
这个项目只能写给一个用户群:让我们称之为“mygroup”。 在SSH会话期间,由当前用户创build的所有文件/目录应默认为组“mygroup”拥有,并具有组可写权限。
我可以用umask解决权限问题:
$ cd project $ umask 002 $ touch test.txt
文件“test.txt”现在是可写组的,但仍属于我的默认组(“mislav”,与我的用户名相同),而不属于“mygroup”。 我可以recursionchgrp来设置所需的组,但我想知道是否有一种方法来隐式设置一些组,像umask更改会话期间的默认权限。
这个特定的目录是一个工作副本的共享git仓库,我希望git checkout和git reset操作为在工作副本中创build的新文件设置正确的掩码和组。 操作系统是Ubuntu Linux。
更新:一位同事build议我应该研究POSIX ACL的 getfacl / setfacl,但是在当前会话中,下面的解决scheme与umask 002结合起来对我来说是足够好的,而且更简单。
为了让给定目录下的所有文件inheritance组权限,您需要使用目录上的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
如果要使用现有文件夹执行此操作,则需要确保为所有子文件夹启用了setgid位。 但是,您不需要它在文件上,而且您可能也不需要在文件上。 以下是如何recursion设置所有子文件夹。
find /path/to/base/dir -type d -exec chmod g+s {} +
对于* nix方面,我并不是很专业,但我认为你要找的是setgid。
看到这里 。
我找不到源,但使用setgid来解决这个问题的裸git仓库,我认为是你的情况,已被弃用,并可能导致在某些情况下的问题。
Git可以通过core.sharedRepository标志来处理所有这些core.sharedRepository 。 我有同样的问题,解决它如下:
假设repogroup是你的组,并且你有cd到repo目录:
首先将共享标志更改为group :
git config core.sharedRepository group
注意:这里您必须使用关键字group ,而不是组名称。 这相当于使用选项--shared=group创build裸存储库。
然后更改整个存储库的组:
chgrp -R repogroup .
为了确保现有目录是可写组( g+w ),并且现有可执行文件也成为组可执行文件( g+X ),您还需要:
chmod -R g+wX .
一旦你完成了这个任务,git将会尊重shared=group标志,并且在现有的和新的文件中处理下面的组权限,所以你不再需要umask或者chgrp 。
如果我找回来的话,我会把源文件放在注释里。
在不使用ACL的情况下,很难在Linux / UNIX中inheritance父目录权限。 但有一种方法来分配默认的文件权限,检查下面的链接
你能inheritance父目录权限吗?