Forma buena y fácil de compartir archivos en una máquina local

13

Me gustaría tener un directorio que tenga las siguientes propiedades:

  • Muchos usuarios pueden copiar archivos en él
  • Estos archivos pueden ser eliminados / modificados por estos usuarios (el usuario A puede eliminar / modificar el archivo que se copió en este directorio)

no se puede hacer usando permisos de archivo normales (porque los permisos se retienen en la copia).

Esto es lo que encontré en la red:

Algunos casos de uso:

  • Compartir música en una máquina local
  • Uso compartido simple del repositorio de git (solo haga que un repositorio desnudo pueda escribirse para muchas personas) --- Sé que hay soluciones como la gitosis
  • Permitir que muchos desarrolladores modifiquen la instancia de prueba de la aplicación php sin darles root (supongo que copiarían archivos) --- ¡Dirijo un equipo de desarrolladores junior sin fines de lucro y necesito que sea simple!

EDITAR

La configuración AFAIK del bit SGID no es suficiente, solo afecta a los archivos recién creados --- y al flujo de trabajo básico para estos casos de uso, copia de ivnolves y otras operaciones (que cortan el gid del archivo sin cambios)

jb.
fuente

Respuestas:

9

Listas de control de acceso

La respuesta directa son las listas de control de acceso (ACL) . Sí, puedes encontrar un contraejemplo, pero son lo suficientemente buenos en la práctica (a diferencia de la simple escritura grupal que requiere que los usuarios piensen en ello todo el tiempo). Lo que sí requieren es que el administrador del sistema (root) defina los grupos, si desea que los archivos sean compartidos solo por un grupo con nombre (root puede elegir delegar, por ejemplo, aceptando grupos de LDAP, pero esa es otra historia).

Es necesario que los usuarios participantes tengan una umask de 022. Si crean rutinariamente archivos que no se pueden leer en todo el mundo, este esquema no funcionará. Pero si tienen una máscara de usuario restrictiva, es presumiblemente porque no quieren compartir archivos de todos modos.

Habilitación de ACL

Ubuntu no habilita las ACL de forma predeterminada, por lo que hay un requisito de administrador único. Edite /etc/fstabutilizando su editor favorito y cambie cada línea correspondiente a un sistema de archivos donde desea compartir archivos: agregue acla las opciones. (Asegúrese de no cambiar ninguna otra línea y de no usar un editor que envuelva líneas largas). Aquí hay una línea de ejemplo con la aclopción agregada:

UUID=5e1ec7ed-face-dead-beef-c011ec7ab1e5  /  ext4  errors=remount-ro,acl  0 1

Para que la opción surta efecto la primera vez, use un comando como el siguiente (para cada sistema de archivos):

sudo mount -o remount,acl /

Instale las herramientas de ACL del aclpaquete.

Configurar el directorio compartido

Para tener archivos compartidos por el grupo mygroup:

setfacl -m group:mygroup:rwx /path/to/shared/root
setfacl -d -m group:mygroup:rwx /path/to/shared/root

Si las personas crean archivos y los copian en el directorio compartido, los archivos serán legibles en todo el mundo (debido a la máscara de usuario) y cualquier persona en el grupo puede agregar y eliminar archivos (porque el grupo se puede escribir en grupo). La gente no puede editar los archivos de los demás, pero eso es algo bueno o te encontrarás con conflictos de edición de inmediato.

Si no tiene un grupo unix, puede agregar usuarios uno por uno:

setfacl -m user:bob:rwx /path/to/shared/root
setfacl -d -m user:bob:rwx /path/to/shared/root

Control de versiones

Si desea que las personas puedan editar archivos en su lugar, también necesita algo para evitar conflictos de edición. Eso es control de versiones.

No necesita nada de esto para compartir un repositorio git. Sabes que hay soluciones como la gitosis, así que úsalas.

Gilles 'SO- deja de ser malvado'
fuente
ACL funcionaría perfectamente si la herencia automática no se rompiera por cp (¿y mv?) Que descarta (ignora) la acl predeterminada establecida en el nivel del directorio de destino.
útil el
2

Simplemente haz esto:

mkdir /src/teamA
addgroup teamA
chgrp teamA /src/teamA
chmod g+rws /src/teamA

Ahora todos en el teamAgrupo pueden hacer todo dentro/src/teamA

La magia es el bit sgid (establecer id de grupo) en el directorio.

concha
fuente
AFAIK no funcionará, vea la publicación actualizada
jb.
1

Si desea que los usuarios puedan acceder a los archivos en una carpeta compartida (por ejemplo, diferentes personas inician sesión en la misma máquina en diferentes momentos y necesitan acceso a los mismos archivos), puede usar bindfspara crear un directorio compartido.

Permite que múltiples usuarios locales lean y escriban (crear, eliminar, renombrar, modificar ...) todos los archivos (incluidos los recién creados) desde un directorio compartido y sus subdirectorios. Cada usuario verá los archivos y carpetas (incluidos los recién creados) como pertenecientes a ellos.

Brevemente, corres

sudo bindfs -o perms=0700,mirror-only=user1:user2:user3 /home/shared /home/shared

poner / home / shared disponible para usuario1, usuario2 y usuario3.

Instrucciones

Consulte Bindfs-SharedDirectoryLocalUsers (documentación de Ubuntu) para obtener instrucciones completas, incluida la configuración permanente (cada vez que enciende su computadora). Utilizo esto en mi propia máquina para varios directorios, cada uno con diferentes grupos para compartir (una carpeta está disponible para todas las cuentas, otra solo para cuentas de trabajo, otra solo para cuentas personales).

Del post:

bindfs es un sistema de archivos FUSE para montar un directorio en otra ubicación (punto de montaje), con configuración de permisos. Le permite especificar la propiedad y los permisos de los archivos desde el interior del punto de montaje.

...

El principal beneficio es que los nuevos archivos creados en el directorio compartido heredarán la propiedad y los permisos.

Listas de control de acceso (ACL)

Las notas de documentación:

Si desea configurar permisos más avanzados para diferentes usuarios y / o grupos, pruebe las Listas de control de acceso .

Ver la respuesta de Gilles para más detalles.

david.libremone
fuente
si tiene problemas para agregar bindfs en oneiric, puede obtener paquetes creados por el usuario aquí bugs.launchpad.net/ubuntu/+source/bindfs/+bug/851600
david.libremone
-3

Puede combinar la solución de Shellholic con un trabajo cron que actualiza el gid para todos los archivos en esa carpeta cada 15 segundos o algo similar.

David Oneill
fuente