Especifique el grupo predeterminado y los permisos para nuevos archivos en un directorio determinado

15

Tengo un determinado directorio en el que hay un proyecto compartido por varios usuarios. Estos usuarios usan SSH para obtener acceso a este directorio y modificar / crear archivos.

Este proyecto solo debe poder escribirse para un determinado grupo de usuarios: llamémoslo "mygroup". Durante una sesión SSH, todos los archivos / directorios creados por el usuario actual deberían ser propiedad del grupo "mygroup" y tener permisos de escritura grupales.

Puedo resolver el problema de permisos con umask:

$ cd project
$ umask 002
$ touch test.txt

El archivo "test.txt" ahora se puede escribir en grupo, pero aún pertenece a mi grupo predeterminado ("mislav", igual que mi nombre de usuario) y no a "mygroup". Puedo establecer chgrprecursivamente el grupo deseado, pero quería saber si hay alguna forma de establecer implícitamente algún grupo como umask cambia los permisos predeterminados durante una sesión.

Este directorio específico es un repositorio git compartido con una copia de trabajo y yo quiero git checkouty git resetoperaciones para ajustar la máscara correcta y el grupo de nuevos archivos creados en la copia de trabajo. El sistema operativo es Ubuntu Linux.

Actualización: un colega sugiere que debería buscar getfacl / setfacl de POSIX ACL, pero la solución que se muestra a continuación umask 002en la sesión actual es lo suficientemente buena para mí y es mucho más simple.

mislav
fuente

Respuestas:

19

Para que todos los archivos de un directorio determinado hereden derechos de grupo, debe usar el bit setgid en su directorio. Ver este enlace .

 $ 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
Phaphink
fuente
Gracias. Interesante que no encontré esto buscando en Google
mislav el
6

Si desea hacer esto con una carpeta existente, debe asegurarse de que el bit setgid también esté habilitado para todas las subcarpetas. Sin embargo, no lo necesita en los archivos, y probablemente tampoco lo desee en los archivos. Aquí se explica cómo configurarlo para todas las subcarpetas de forma recursiva.

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

No puedo encontrar la fuente de nuevo, pero el uso setgidpara resolver este problema para repositorios desnudos de git, que supongo que es su caso, está en desuso y puede causar problemas en algunos casos.

Git puede encargarse de todo esto a través de la core.sharedRepositorybandera. Tuve el mismo problema y lo resolví de la siguiente manera:

Asumiendo que repogroupes su grupo, y tiene que cdir al directorio de repositorios:

Primero cambie la bandera compartida a group:

git config core.sharedRepository group 

Nota: aquí debe usar la palabra clave group, no el nombre del grupo. Esto es equivalente a crear el repositorio simple con opción --shared=group.

Luego cambie el grupo para todo el repositorio:

chgrp -R repogroup .

Para asegurarse de que los directorios existentes sean de escritura grupal ( g+w) y que los ejecutables existentes también se conviertan en ejecutables de grupo ( g+X), también debe:

chmod -R g+wX .

Una vez hecho esto, Git cumplirá con la shared=groupbandera y cuidar de los permisos de grupo en la siguiente, tanto para los archivos existentes y nuevos, por lo que nunca tendrá que volver de nuevo a umasko chgrp.

Pondré la fuente en un comentario si la encuentro de nuevo.

ggll
fuente
3

No soy un gran experto cuando se trata del lado * nix, pero creo que lo que estás buscando se llama setgid.

Ver aquí .

ThatGraemeGuy
fuente