Linux: pérdida de la propiedad grupal de los archivos

8

Tengo un proyecto con varios archivos que creé en Linux.

Y necesitaba darle a otro usuario permiso de escritura sobre ellos. Así que creé un grupo "dev" del cual él y yo somos miembros y cambié la propiedad de los archivos a este grupo.

Un archivo típico ahora tiene estos permisos:

-rw-rw-r--  1 phil dev   5617 Jul 14 15:45 profile.html

Sin embargo, cuando edito el archivo profile.html me vuelve así, y mi colega pierde la capacidad de editar.

-rw-rw-r--  1 phil phil  5617 Jul 14 15:45 profile.html

¿Cómo evito que se revierta así? ¿Cambiar la propiedad era algo incorrecto? ¿O se hizo con las opciones incorrectas? ¿O tiene que ver esto con la configuración de mi editor (emacs)?

interestar
fuente

Respuestas:

17

En la carpeta que contiene, querrá cambiar el grupo para que sea dev y luego marque set-gid.

chgrp dev <containing-folder>
chmod g+ws <containing-folder>

El bit set gid hace que los archivos creados en esa carpeta hereden el grupo de la carpeta y marca el bit setgid en cualquier carpeta nueva. Deberá tener cuidado al mover archivos al directorio, ya que preservará sus permisos existentes.

Frenchie
fuente
solo un remedio (vea mi respuesta)
asdmin
8

Puede usar el bit setgid en un directorio para preservar la propiedad de los grupos por parte de los niños.

chown :dev directory/
chmod g+s directory/
Dan Carley
fuente
solo un remedio (vea mi respuesta)
asdmin
7

También puede montar el sistema de archivos (suponiendo ext2 / 3) con la opción de montaje grpid, lo que hará que cada vez que cree un nuevo archivo en un directorio, haga que el propietario del grupo sea el mismo que el directorio principal. Entonces, simplemente lo haría para que el directorio en el que existen estos archivos sea propiedad del grupo 'dev'.

Para volver a montarlo si es la partición raíz (ejemplo):

sudo mount -o remount,grpid,rw,relatime,errors=remount-ro /

Desde 'man mount 8':

grpid or bsdgroups / nogrpid or sysvgroups
These options define what group id a newly created file gets.

Cuando se establece grpid, toma la identificación del grupo del directorio en el que se crea; de lo contrario (el valor predeterminado) toma el fsgid del proceso actual, a menos que el directorio tenga establecido el bit setgid, en cuyo caso toma el gid del directorio padre y también obtiene el bit setgid si es un directorio en sí mismo.

Kyle Brandt
fuente
Dato muy útil para saber +1
Frenchie
¿Esto también mantendrá el permiso de escritura del grupo si crea o copia un archivo?
KB
1

El comportamiento predeterminado para emacs es crear el archivo de copia de seguridad cambiando el nombre. Del manual de emacs:

Emacs puede cambiar el nombre del archivo original para que se convierta en un archivo de copia de seguridad y luego escribir el búfer guardado en un nuevo archivo. Después de este procedimiento, cualquier otro nombre (es decir, enlaces duros) del archivo original ahora se refiere al archivo de respaldo. El nuevo archivo es propiedad del usuario que realiza la edición, y su grupo es el predeterminado para los nuevos archivos escritos por el usuario en ese directorio, por el usuario en ese directorio.

Hay varias formas de cambiar esto.

  • Establezca el grupo y la parte adhesiva, como otros describen
  • Ejecute 'newgrp dev' antes de editar el archivo, de modo que su grupo predeterminado sea dev.

O emacs específicos:

  • Establezca file-precious-flag en emacs, que cambia el comportamiento para preservar el grupo, pero tiene otros efectos secundarios.
  • Establezca copia de seguridad copiando cuando no coincida en emacs, que utiliza la copia en lugar de cambiar el nombre cuando eso causaría que el propietario o el grupo cambien.

Entonces, agregue a sus .emacs:

(setq backup-by-copying-when-mismatch 't)

Mi preferencia es en realidad 'newgrp dev', ya que es un cambio explícito del modo "personal" (los archivos que edito son solo míos) al modo de desarrollo grupal (los archivos que ahora edito se comparten entre el grupo).

jmanning2k
fuente
Esta es la mejor respuesta aquí.
Christopher Neylan