Perché rm può rimuovere i file di sola lettura?


92

Se creo un file e poi cambio le sue autorizzazioni in 444(sola lettura), come rmmai posso rimuoverlo?

Se lo faccio:

echo test > test.txt
chmod 444 test.txt
rm test.txt

... rmchiederà se desidero rimuovere il file protetto da scrittura test.txt. Mi sarei aspettato che rmnon fosse possibile rimuovere un file del genere e che avrei dovuto fare un chmod +w test.txtprimo. Se faccio rm -f test.txtquindi rmrimuoverà il file senza nemmeno chiedere, anche se è di sola lettura.

Qualcuno può chiarire? Sto usando Ubuntu 12.04 / bash.


Chiarimento: sto eseguendo questi comandi come il mio utente normale, non come root.
Magnus,

Risposte:


104

Tutto ciò che rmserve è scrivere + eseguire l'autorizzazione nella directory principale. Le autorizzazioni del file stesso sono irrilevanti.

Ecco un riferimento che spiega il modello delle autorizzazioni in modo più chiaro che mai:

Qualsiasi tentativo di accedere ai dati di un file richiede l'autorizzazione di lettura. Qualsiasi tentativo di modificare i dati di un file richiede l'autorizzazione di scrittura. Qualsiasi tentativo di eseguire un file (un programma o uno script) richiede l'autorizzazione di esecuzione ...

Poiché le directory non vengono utilizzate allo stesso modo dei file normali, le autorizzazioni funzionano leggermente (ma solo leggermente) in modo diverso. Un tentativo di elencare i file in una directory richiede l'autorizzazione di lettura per la directory, ma non sui file all'interno. Un tentativo di aggiungere un file a una directory, eliminare un file da una directory o rinominare un file, richiede tutti l'autorizzazione di scrittura per la directory, ma (forse sorprendentemente) non per i file all'interno. L'autorizzazione di esecuzione non si applica alle directory (una directory non può essere anche un programma). Ma quel bit di autorizzazione viene riutilizzato per le directory per altri scopi.

È necessaria l'autorizzazione di esecuzione su una directory per poterlo inserire in cd (ovvero, per rendere una directory la directory di lavoro corrente).

È necessario eseguire su una directory per accedere alle informazioni "inode" dei file all'interno. È necessario questo per cercare una directory per leggere gli inode dei file all'interno. Per questo motivo l'autorizzazione di esecuzione su una directory viene spesso chiamata autorizzazione di ricerca.


2
Quindi, se volessi creare una directory in cui alcuni file non potessero essere cancellati / modificati senza fare prima chmod, ma altri potrebbero essere liberamente scrivibili, sarebbe impossibile? Dovrei chmod la directory 555, il che significherebbe che nessun file nella directory potrebbe essere creato o modificato.
Magnus,

3
@Magnus - Ovviamente, non c'è niente che ti impedisce di creare una directory figlio scrivibile all'interno della directory di sola lettura e di archiviare i tuoi file scrivibili all'interno. La directory figlio stessa non può essere eliminata, ma il suo contenuto può farlo.
ire_and_curses,

7
Non riesci a rendere una directory appiccicosa in +tmodo che le persone non possano più modificare o rimuovere i file in quella directory che non possiedono anche se hanno accesso in scrittura alla directory?
Shadur,

3
@Magnus Se si dispone dell'accesso root (incluso sudo), è possibile utilizzare chattrper aggiungere il flag immutabile ai file. Altrimenti, allora ire_and_curses è del tutto corretto.
James O'Gorman,

6
Non usare rm -f funziona solo fintanto che sono sobrio ... in più, non ho idea di cosa possano o meno fare gli script bash ritardati che scrivo
Magnus,

53

Ok, secondo il tuo commento a ire_and_curses, quello che vuoi davvero fare è rendere alcuni file immutabili. Puoi farlo con il chattrcomando. Per esempio:

per esempio

$ cd /tmp
$ touch immutable-file
$ sudo chattr +i immutable-file

$ rm -f immutable-file
rm: remove write-protected regular empty file `immutable-file'? y
rm: cannot remove `immutable-file': Operation not permitted

$ mv immutable-file someothername
mv: cannot move `immutable-file' to `someothername': Operation not permitted

$ echo foo > immutable-file 
-bash: immutable-file: Permission denied

Non puoi fare nulla su un file immutabile: non puoi eliminarlo, modificarlo, sovrascriverlo, rinominarlo, modificarlo o modificarlo o altro. L'unica cosa che puoi fare con esso è leggerlo (se le autorizzazioni unix lo consentono) e (come root) chattr -iper rimuovere il bit immutabile.

Non tutti i filesystem supportano tutti gli attributi. AFAIK, immutabile è supportato da tutti i comuni filesystem linux (inclusi ext2 / 3/4 e xfs. Zfsonlinux non supporta affatto gli attributi al momento)


3
è occasionalmente utile. tra l'altro, nemmeno root può modificare o eliminare un file immutabile (non senza prima rimuovere l'attributo immutabile). anche a proposito, usa lsattrper elencare gli attributi.
Cas

2
+1 - Mi ero dimenticato degli attributi, ed ero così impegnato a rispondere alla domanda letterale su rmquesto che non mi è mai venuto in mente ...
ire_and_curses

2
Questo è specifico del filesystem e questo potrebbe portare più problemi che risolve.
Stéphane Gimenez,

4
@Magnus: i possibili problemi includono il backup (non tutte le utilità di backup eseguiranno il backup degli attributi - in effetti, la maggior parte non lo farà) e il ripristino (se ripristini in una directory che contiene già un file immutabile, alcuni programmi tratteranno l'impossibilità di sovrascrivere quel file come errore fatale e interrompere). Inoltre, puoi creare confusione se dimentichi di aver reso immutabile un file e non riesci a capire perché non puoi eliminarlo .... Il messaggio di errore "Operazione non consentita" è lo stesso messaggio di errore che vedi con alcuni tipi di filesystem corruzione, che può portare a reazioni potenzialmente pericolose.
Cas

1
È possibile copiare (cp) un file immutabile.
Polpo

0

Una risposta a questa domanda afferma che è possibile eliminare un file dalla directory solo se ha solo l' writeautorizzazione è totalmente sbagliato! provalo! Dai una directory solo il writepermesso e prova a cancellare, non puoi!
Per eliminare un file all'interno di una directory sono necessari entrambi writee l' executeautorizzazione per la directory

Ora torniamo alla domanda: per eliminare un file usando rmstai semplicemente rimuovendo le sue informazioni di inode dalla directory, cioè non shreddinglo sei dal disco. Se le informazioni sull'inode del file non si trovano nella directory non è possibile accedervi (anche perché non è possibile visualizzarle poiché non è elencato dalla directory principale), ovvero viene eliminato per l'utente.
Pertanto, per eliminare un file da una directory tutto ciò che è permesso sulla directory; le autorizzazioni per quel file sono irrilevanti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.