web-dev-qa-db-fra.com

Pourquoi rm peut-il supprimer des fichiers en lecture seule?

Si je crée un fichier et que je change ses autorisations en 444 (lecture seule), comment se fait-il que rm puisse le supprimer?

Si je fais ça:

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

...rm me demandera si je veux supprimer le fichier protégé en écriture test.txt. Je m'attendais à ce que rm ne puisse pas supprimer un tel fichier et que j'aurais à faire un chmod +w test.txt première. Si je fais rm -f test.txt puis rm supprimera le fichier sans même le demander, même s'il est en lecture seule.

Quelqu'un peut-il clarifier? J'utilise Ubuntu 12.04/bash.

96
Magnus

Tout rm a besoin d'une autorisation d'écriture + exécution sur le répertoire parent. Les autorisations du fichier lui-même ne sont pas pertinentes.

Voici ne référence qui explique le modèle d'autorisations plus clairement que jamais:

Toute tentative d'accès aux données d'un fichier nécessite une autorisation de lecture. Toute tentative de modification des données d'un fichier nécessite une autorisation d'écriture. Toute tentative d'exécution d'un fichier (un programme ou un script) nécessite une autorisation d'exécution ...

Étant donné que les répertoires ne sont pas utilisés de la même manière que les fichiers normaux, les autorisations fonctionnent légèrement (mais seulement légèrement) différemment. Une tentative de répertorier les fichiers dans un répertoire nécessite une autorisation de lecture pour le répertoire, mais pas sur les fichiers qu'il contient. Une tentative d'ajouter un fichier à un répertoire, de supprimer un fichier d'un répertoire ou de renommer un fichier nécessite tous une autorisation d'écriture pour le répertoire, mais (peut-être de manière surprenante) pas pour les fichiers qu'il contient. L'autorisation d'exécution ne s'applique pas aux répertoires (un répertoire ne peut pas également être un programme). Mais ce bit d'autorisation est réutilisé pour des répertoires à d'autres fins.

Une autorisation d'exécution est nécessaire sur un répertoire pour pouvoir y entrer (c'est-à-dire faire de certains répertoires votre répertoire de travail actuel).

Exécuter est nécessaire sur un répertoire pour accéder aux informations "inode" des fichiers qu'il contient. Vous en avez besoin pour rechercher un répertoire dans lequel lire les inodes des fichiers. Pour cette raison, l'autorisation d'exécution sur un répertoire est souvent appelée autorisation de recherche à la place.

110
ire_and_curses

Ok, selon votre commentaire à ire_and_curses, ce que vous voulez vraiment faire, c'est rendre certains fichiers immuables. Vous pouvez le faire avec la commande chattr. Par exemple:

par exemple.

$ 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

Vous ne pouvez rien faire à un fichier immuable - vous ne pouvez pas le supprimer, le modifier, l'écraser, le renommer, le chmod ou l'illustrer, ou quoi que ce soit d'autre. La seule chose que vous pouvez faire est de le lire (si les autorisations Unix le permettent) et (en tant que root) chattr -i pour supprimer le bit immuable.

Tous les systèmes de fichiers ne prennent pas en charge tous les attributs. AFAIK, immuable est pris en charge par tous les systèmes de fichiers Linux courants (y compris ext2/3/4 et xfs. Zfsonlinux ne prend pas en charge les attributs pour le moment)

53
cas

Une réponse à cette question prétend que vous ne pouvez supprimer un fichier du répertoire que s'il a juste l'autorisation write est totalement erronée! essayez-le! Donnez à un répertoire une autorisation de write et essayez de supprimer, vous ne pouvez pas!
Pour supprimer un fichier dans un répertoire, vous avez besoin des autorisations write et execute sur le répertoire

Revenons maintenant à la question: pour supprimer un fichier à l'aide de rm, vous supprimez simplement ses informations d'inode du répertoire, c'est-à-dire que vous n'êtes pas shredding du disque. Si les informations inode du fichier ne sont pas dans le répertoire, vous ne pouvez pas y accéder (également parce que vous ne pouvez pas les voir car elles ne sont pas répertoriées par son répertoire parent) c'est-à-dire qu'elles sont supprimées pour vous.
Ainsi, pour supprimer un fichier d'un répertoire, vous n'avez que l'autorisation sur le répertoire; les autorisations sur ce fichier ne sont pas pertinentes

0
Edward Torvalds