Potresti usare bindfs
come:
$ ls -ld dir
drwxr-xr-t 2 stephane stephane 4096 Aug 12 12:28 dir/
Quella directory è di proprietà di stephane, con il gruppo stephane (stephane è il suo unico membro). Nota anche il t
che impedisce agli utenti di rinominare o rimuovere voci di cui non sono proprietari.
$ sudo bindfs -u root -p u=rwD,g=r,dg=rwx,o=rD dir dir
Noi bindfs
dir
su se stesso con proprietà e autorizzazioni fisse per file e directory. Tutti i file appaiono di proprietà di root
(sebbene sotto nella directory reale siano ancora di proprietà di stephane).
Le directory ottengono drwxrwxr-x root stephane
autorizzazioni mentre altri tipi di file ottengono -rw-r--r-- root stephane
quelli.
$ ls -ld dir
drwxrwxr-t 2 root stephane 4096 Aug 12 12:28 dir
Ora la creazione di un file funziona perché la directory è scrivibile:
$ echo test > dir/file
$ ls -ld dir/file
-rw-r--r-- 1 root stephane 5 Aug 12 12:29 dir/file
Tuttavia non è possibile eseguire una seconda scrittura open()
su quel file in quanto non abbiamo il permesso su di esso:
$ echo test > dir/file
zsh: permission denied: dir/file
(nota che l'aggiunta non è consentita lì (poiché non fa parte dei tuoi requisiti iniziali)).
Una limitazione:mentre non puoi rimuovere o rinominare le voci in dir
a causa del t
bit, le nuove directory che crei non avranno quel t
bit, quindi sarai in grado di rinominare o eliminare le voci lì.
Il chattr +a
l'opzione consentirà solo l'aggiunta. I file possono essere modificati in questo modo, ma solo aggiungendo (cioè aggiungendo righe) ad essi. Non è possibile eliminare i file esistenti, ma crearne di nuovi. Questo potrebbe soddisfare le tue esigenze:
sudo chattr -R +a /dir/to/apply/to
da man chattr
Un file con l'attributo `a' impostato può essere aperto solo in modalità append per la scrittura. Solo il superutente o un processo che possiede la capacità CAP_LINUX_IMMUTABLE può impostare o cancellare questo attributo.
(nota che vale anche per le directory)
Quindi il tuo elenco sarebbe simile a:
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