Especifique o grupo e permissões padrão 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 deve ser gravável apenas para um determinado grupo de usuários: vamos chamá-lo de "meu grupo". 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 de gravação de grupo.

Posso resolver o problema de permissões com umask:

$ cd project
$ umask 002
$ touch test.txt

O arquivo "test.txt" agora pode ser gravado em grupo, mas ainda pertence ao meu grupo padrão ("mislav", igual ao meu nome de usuário) e não ao "mygroup". Posso chgrpdefinir recursivamente o grupo desejado, mas eu queria saber se existe uma maneira de definir implicitamente algum grupo, 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 git checkoute git resetoperações para definir a máscara correta e grupo para novos arquivos criados na cópia de trabalho. O sistema operacional é o Ubuntu Linux.

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

mislav
fonte

Respostas:

19

Para que todos os arquivos em um determinado diretório herdam os direitos do grupo, você precisa usar o bit setgid no seu diretório. Veja 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
ℝaphink
fonte
Obrigado. Interessante que eu não encontrar este por googling
Mislav
6

Se você quiser fazer isso com uma pasta existente, verifique se o bit setgid também está ativado para todas as subpastas. No entanto, você não precisa disso em arquivos e provavelmente também não deseja. Aqui está como configurá-lo para todas as subpastas recursivamente.

find /path/to/base/dir -type d -exec chmod g+s {} +
andrewtweber
fonte
4

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

O Git pode cuidar de tudo isso através da core.sharedRepositorybandeira. Eu tive o mesmo problema e resolvi-o da seguinte maneira:

Supondo que repogroupseja o seu grupo, e você tenha cdo diretório repo:

Primeiro mude o sinalizador compartilhado para group:

git config core.sharedRepository group 

Nota: aqui você deve usar a palavra-chave group, não o nome do grupo. Isto é equivalente a criar o repositório nua 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 tornem executáveis ​​em grupo ( g+X), você também precisa:

chmod -R g+wX .

Depois de fazer isso, o git honrará a shared=groupflag e cuidará das permissões de grupo a seguir, para arquivos existentes e novos, para que você nunca precise novamente fazer o umaskou chgrp.

Colocarei a fonte em um comentário se a encontrar de volta.

ggll
fonte
3

Eu não sou muito especialista no que diz respeito ao lado * nix, mas acho que o que você está procurando é chamado setgid.

Veja aqui .

ThatGraemeGuy
fonte