Especifique o grupo padrão e as permissões para novos arquivos em um determinado diretório

15

Eu tenho um determinado diretório no qual há um projeto compartilhado por vários usuários. Esses usuários usam o SSH para obter acesso a esse diretório e modificar / criar arquivos.

Este projeto só deve ser gravável para um determinado grupo de usuários: vamos chamá-lo de "mygroup". Durante uma sessão SSH, todos os arquivos / diretórios criados pelo usuário atual devem, por padrão, pertencer ao grupo "mygroup" e ter permissões graváveis em grupo.

Eu posso resolver o problema de permissões com umask :

$ cd project
$ umask 002
$ touch test.txt

O arquivo "test.txt" agora é gravável em grupo, mas ainda pertence ao meu grupo padrão ("mislav", igual ao meu nome de usuário) e não ao "mygroup". Eu posso chgrp recursivamente para definir o grupo desejado, mas eu queria saber se há uma maneira de definir um grupo implicitamente como umask altera as permissões padrão durante uma sessão.

Este diretório específico é um repositório git compartilhado com uma cópia de trabalho e eu quero que as operações git checkout e git reset definam a máscara e o grupo corretos para os novos arquivos criados na cópia de trabalho. O sistema operacional é o Ubuntu Linux.

Atualização: um colega sugere que eu procure em getfacl / setfacl de POSIX ACL mas a solução abaixo combinada com umask 002 na sessão atual é boa o suficiente para mim e é muito mais simples.

    
por mislav 21.12.2009 / 15:39

5 respostas

19

Para que todos os arquivos em um determinado diretório herdem direitos de grupo, você precisa usar o bit setgid em seu diretório. Consulte este link .

 $ 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
    
por 21.12.2009 / 16:20
5

Se você quiser fazer isso com uma pasta existente, é necessário certificar-se de que o bit setgid também esteja ativado para todas as subpastas. No entanto, você não precisa dele nos arquivos e provavelmente também não o deseja nos arquivos. Veja como configurá-lo para todas as subpastas de forma recursiva.

find /path/to/base/dir -type d -exec chmod g+s {} +
    
por 05.06.2014 / 22:13
3

Eu não sou muito especialista quando se trata do lado do * nix, mas acho que o que você está procurando é chamado setgid.

Veja aqui .

    
por 21.12.2009 / 16:19
3

Não consigo encontrar a fonte de volta, mas usar setgid para resolver esse problema para repositórios git simples, que suponho ser seu caso, está obsoleto e pode causar problemas em alguns casos.

O Git pode cuidar de tudo isso através do core.sharedRepository flag. Eu tive o mesmo problema e resolvi da seguinte forma:

Assumindo que repogroup é seu grupo e você tem cd no diretório do repo:

Primeiro altere o sinalizador compartilhado para group :

git config core.sharedRepository group 

Observação: aqui você deve usar a palavra-chave group , não o nome do grupo. Isso é equivalente a criar o repositório bare com a opção --shared=group .

Em seguida, altere o grupo para todo o repositório:

chgrp -R repogroup .

Para garantir que os diretórios existentes sejam graváveis em grupo ( g+w ), e os executáveis existentes também se tornam executáveis de grupo ( g+X ) você também precisa:

chmod -R g+wX .

Depois de fazer isso, o git homenageará o shared=group flag e cuidará das permissões do grupo a seguir, tanto para arquivos novos quanto para existentes, para que você nunca precise novamente de umask ou chgrp .

Vou colocar a fonte em um comentário, se eu encontrá-lo de volta.

    
por 12.04.2016 / 13:07
1

É difícil herdar permissões de diretório pai no Linux / UNIX sem usar ACLs. mas existe uma maneira de atribuir permissões de arquivo padrão, verifique o link abaixo

Você pode herdar as permissões do diretório pai?

    
por 29.03.2010 / 18:44