Podrías usar bindfs
como:
$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/
Ese directorio es propiedad de stephane, con el grupo stephane (stephane es su único miembro). También tenga en cuenta el t
que evita que los usuarios cambien el nombre o eliminen entradas que no son de su propiedad.
$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir
Nosotros bindfs
dir
sobre sí mismo con propiedad fija y permisos para archivos y directorios. Todos los archivos aparecen como propiedad de root
(aunque debajo en el directorio real todavía son propiedad de stephane).
Los directorios obtienen drwxrwxr-x root stephane
permisos mientras que otros tipos de archivos obtienen -rw-r--r-- root stephane
unos.
$ ls -ld dir
drwxrwxr-t 2 root stephane 4096 Aug 12 12:28 dir
Ahora la creación de un archivo funciona porque se puede escribir en el directorio:
$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file
Sin embargo, no es posible hacer una segunda escritura open()
en ese archivo ya que no tenemos permiso sobre él:
$ echo test > dir/file
zsh: permission denied: dir/file
(Tenga en cuenta que no se permiten anexar allí (ya que no es parte de sus requisitos iniciales)).
Una limitación:aunque no puede eliminar o cambiar el nombre de las entradas en dir
por el t
bit, los nuevos directorios que cree allí no tendrán ese t
bit, por lo que podrá cambiar el nombre o eliminar entradas allí.
El chattr +a
La opción permitirá agregar solamente. Los archivos se pueden modificar de esa manera, pero solo agregándoles (es decir, agregando líneas). No puede eliminar archivos existentes, pero sí crear otros nuevos. Esto podría ajustarse a sus necesidades:
sudo chattr -R +a /dir/to/apply/to
de man chattr
Un archivo con el conjunto de atributos 'a' solo se puede abrir en modo de adición para escritura. Solo el superusuario o un proceso que posea la capacidad CAP_LINUX_IMMUTABLE puede establecer o borrar este atributo.
(tenga en cuenta que también se aplica a los directorios)
Entonces su lista se vería así:
echo hello > test # succeeds, because test doesn't exist, and creation is allowed
echo hello2 > test # fails, because test already exists, and overwriting is not allowed
echo hello3 >> test # succeeds, because appending is allowed
cat test # succeeds, because reads are allowed
rm test # fails, because delete is not allowed