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

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

这个项目只能写给一个用户群:让我们称之为“mygroup”。 在SSH会话期间,由当前用户创build的所有文件/目录应默认为组“mygroup”拥有,并具有组可写权限

我可以用umask解决权限问题:

 $ cd project $ umask 002 $ touch test.txt 

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

这个特定的目录是一个工作副本的共享git仓库,我希望git checkoutgit 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父目录权限吗?