Vous pouvez utiliser bindfs
comme :
$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/
Ce répertoire appartient à stephane, avec le groupe stephane (stephane étant son seul membre). Notez également le t
qui empêche les utilisateurs de renommer ou de supprimer des entrées dont ils ne sont pas propriétaires.
$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir
Nous bindfs
dir
sur lui-même avec une propriété et des autorisations fixes pour les fichiers et les répertoires. Tous les fichiers semblent appartenir à root
(bien qu'en dessous dans le vrai répertoire, ils appartiennent toujours à stephane).
Les répertoires obtiennent drwxrwxr-x root stephane
autorisations tandis que d'autres types de fichiers obtiennent -rw-r--r-- root stephane
ceux.
$ ls -ld dir
drwxrwxr-t 2 root stephane 4096 Aug 12 12:28 dir
Maintenant, la création d'un fichier fonctionne car le répertoire est accessible en écriture :
$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file
Cependant, il n'est pas possible de faire une seconde écriture open()
sur ce fichier car nous n'avons pas la permission dessus :
$ echo test > dir/file
zsh: permission denied: dir/file
(notez que l'ajout n'est pas autorisé ici (car ne faisant pas partie de vos exigences initiales)).
Une limitation :alors que vous ne pouvez pas supprimer ou renommer des entrées dans dir
à cause du t
bit, les nouveaux répertoires que vous y créez n'auront pas ce t
bit, vous pourrez donc y renommer ou supprimer des entrées.
Le chattr +a
l'option autorisera l'ajout uniquement. Les fichiers peuvent être modifiés de cette façon, mais uniquement en leur ajoutant (c'est-à-dire en ajoutant des lignes). Vous ne pouvez pas supprimer des fichiers existants, mais en créer de nouveaux. Cela pourrait répondre à vos besoins :
sudo chattr -R +a /dir/to/apply/to
à partir de man chattr
Un fichier avec l'attribut `a' défini ne peut être ouvert qu'en mode ajout pour l'écriture. Seul le superutilisateur ou un processus possédant la capacité CAP_LINUX_IMMUTABLE peut définir ou effacer cet attribut.
(notez que cela s'applique également aux répertoires)
Votre liste ressemblerait donc à :
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