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

93

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

Si je fais ça:

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

... rmdemandera si je veux supprimer le fichier protégé en écriture test.txt. Je m'attendais à ce que rmne peut pas supprimer un tel fichier et que je devrais faire une chmod +w test.txtpremière. Si je rm -f test.txtpuis rmsupprime le fichier sans même demander, même si elle est en lecture seule.

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

Magnus
la source
Précision: j'exécute ces commandes en tant qu'utilisateur régulier et non en tant que root.
Magnus

Réponses:

104

Tout ce dont vous rmavez besoin est permission write + execute sur le répertoire parent. Les autorisations du fichier lui-même ne sont pas pertinentes.

Voici une référence qui explique le modèle de permissions 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 en écriture. Toute tentative d'exécution d'un fichier (programme ou script) nécessite l'autorisation d'exécution ...

Comme 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 légèrement) différemment. Une tentative de liste des fichiers dans un répertoire nécessite une autorisation de lecture pour le répertoire, mais pas sur les fichiers qu'il contient. Toute tentative d'ajouter un fichier à un répertoire, de supprimer un fichier d'un répertoire ou de renommer un fichier requiert une autorisation en é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 les répertoires à d'autres fins.

Une autorisation d’exécution est nécessaire sur un répertoire pour pouvoir y être insérée (c’est-à-dire pour en faire un répertoire de travail courant).

L'exécution 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 afin de lire les inodes des fichiers qu’il contient. Pour cette raison, l'autorisation d'exécution sur un répertoire est souvent appelée autorisation de recherche.

ire_et_curses
la source
2
Donc, si je voulais créer un répertoire dans lequel certains fichiers ne pourraient pas être supprimés / modifiés sans faire d’abord chmod, alors que d’autres pourraient être librement écrits, cela serait impossible? Je devrais chmod le répertoire 555, ce qui voudrait dire qu'aucun fichier du répertoire ne pourrait être créé ou modifié.
Magnus
3
@Magnus - Bien entendu, rien ne vous empêche de créer un répertoire enfant en écriture à l'intérieur du répertoire en lecture seule et d'y stocker vos fichiers en écriture. Le répertoire enfant lui-même ne peut pas être supprimé, mais son contenu peut l'être.
ire_and_curses le
7
Ne pouvez-vous pas créer un répertoire collant +tafin que les utilisateurs ne puissent plus modifier ou supprimer les fichiers de ce répertoire qu'ils ne possèdent pas même s'ils ont un accès en écriture au répertoire?
Shadur
3
@Magnus Si vous avez un accès root (y compris sudo), vous pouvez utiliser chattrpour ajouter l'indicateur immuable aux fichiers. Sinon, alors ire_and_curses est tout à fait correct.
James O'Gorman le
6
Ne pas utiliser rm -f ne fonctionne que tant que je suis sobre ... De plus, je n'ai aucune idée de ce que les scripts de retardement ralentis que j'écris peuvent ou ne peuvent pas faire
Magnus
53

Ok, selon votre commentaire à ire_and_curses, ce que vous voulez vraiment faire est de rendre certains fichiers immuables. Vous pouvez le faire avec la chattrcommande. 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 sur un fichier immuable - vous ne pouvez pas le supprimer, le modifier, l'écraser, le renommer, chmod ou le chown, ou quoi que ce soit d'autre. La seule chose à faire est de le lire (si les autorisations Unix le permettent) et (en tant que root) chattr -ide supprimer le bit immuable.

Tous les systèmes de fichiers ne supportent pas tous les attributs. Autant que je sache, immuable est supporté par tous les systèmes de fichiers linux courants (y compris ext2 / 3/4 et xfs. Zfsonlinux ne supporte pas du tout les attributs pour le moment)

cas
la source
3
c'est parfois utile. En fait, même root ne peut pas modifier ou supprimer un fichier immuable (pas sans supprimer l'attribut immuable au préalable). aussi btw, utiliser lsattrpour lister les attributs.
cas le
2
+1 - J'avais oublié les attributs, et j'étais tellement occupé à répondre à la question littérale à propos du fait rmque cela ne m'est jamais arrivé ...
ire_and_curses
2
Ceci est spécifique au système de fichiers et cela pourrait vous apporter plus de problèmes qu’il résout.
Stéphane Gimenez le
4
@Magnus: les problèmes possibles incluent la sauvegarde (tous les utilitaires de sauvegarde ne sauvegardent pas les attributs - en fait, la plupart ne le feront pas) et la restauration (si vous restaurez dans un répertoire contenant déjà un fichier immuable, certains programmes traiteront l'impossibilité d'écraser ce fichier. comme une erreur fatale et avorter). Vous pouvez également créer la confusion si vous oubliez que vous avez créé un fichier immuable et ne comprenez pas pourquoi vous ne pouvez pas le supprimer. Le message d'erreur 'Opération non autorisée' est identique à celui que vous voyez avec certains types de système de fichiers. la corruption, qui peut conduire à une réaction excessive potentiellement dangereuse.
cas le
1
Vous pouvez copier (cp) un fichier immuable.
Octopus
0

Une réponse à cette question affirme que vous pouvez supprimer un fichier d'un répertoire uniquement s'il est simplement writeautorisé, c'est totalement faux! juste l'essayer! Donnez à un répertoire une writepermission et essayez de supprimer, vous ne pouvez pas!
Pour supprimer un fichier dans un répertoire, vous devez avoir à la fois l' autorisation writeet l' executeautorisation sur le répertoire.

Revenons maintenant à la question: pour supprimer un fichier en utilisant, rmvous supprimez simplement ses informations d'inode du répertoire, c'est-à-dire que vous ne l'êtes pas shreddingà partir 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 le voir car il ne figure pas dans son répertoire parent), c'est-à-dire qu'il est supprimé pour vous.
Ainsi, pour supprimer un fichier d'un répertoire, il vous suffit d'une permission sur le répertoire. les autorisations sur ce fichier ne sont pas pertinentes

Edward Torvalds
la source