J'ai un dossier avec des -wx
autorisations appelé folder1
et un autre dossier à l'intérieur appelé folder2
avec des rwx
autorisations.
J'ai essayé de supprimer en folder1
utilisant cette commande:
rm -r folder1
Mais j'ai eu l'erreur suivante:
rm: cannot remove 'folder1': Permission denied
La raison pour laquelle je pense avoir obtenu cette erreur est que le rm
programme doit d'abord obtenir le contenu de folder1
(obtenir les noms des fichiers et des dossiers à l'intérieur folder1
) afin de pouvoir supprimer ce contenu (car vous ne pouvez pas supprimer un fichier ou dossier sans connaître son nom je pense), puis le rm
programme peut se supprimer folder1
.
Mais comme il folder1
n'a pas l' read
autorisation, le rm
programme ne peut pas obtenir son contenu, et donc il ne peut pas supprimer son contenu, et comme il ne peut pas supprimer son contenu, il ne peut pas le supprimer.
Ai-je raison?
la source
Réponses:
Je pense que votre analyse est correcte: vous ne pouvez pas supprimer le répertoire car il n'est pas vide, et vous ne pouvez pas le vider car vous ne pouvez pas voir son contenu.
Je viens de l'essayer:
Quand j'ai écrit «vous», je voulais dire n'importe quel programme que vous pourriez exécuter. Votre
rm -r
commande voit d'abord qu'ilfolder1
s'agit d'un répertoire, elle essaie donc de découvrir son contenu pour le vider, mais échoue pour l'autorisation de lecture manquante, puis elle essaie de le supprimer mais échoue car elle n'est pas vide. La «permission refusée» est trompeuse; Je pense que "Répertoire non vide" (comme lesrmdir
rapports) serait plus approprié.)la source
Directory not empty
dans ce cas car il ne saurait pas qu'il était vide ou non. Vous obtiendriez toujours la même erreur lorsque vous essayez de supprimer un répertoire vide sur lequel vous n'avez pas d'autorisations de lecture. (En outre, veuillez ignorer mon commentaire précédent, je n'avais pas ma casquette de réflexion).rmdir
est capable de signaler «Répertoire non vide». Et si vous lisez mon test, vous verrez qu'il accepte de supprimer lefolder1
répertoire, sans autorisation de lecture , une fois que je l'ai vidé.Permission denied
en essayantrm -r folder1
quand il est vide. Je suis sur OpenBSD, pas Linux.-r
est utilisé, chaque entrée de répertoire (à l'exception de.
et..
) doit être supprimée comme s'il s'agissait d'un opérande de fichier derm -r
. Il semble que GNUrm
fasse simplement unrmdir()
sur le répertoire s'il n'est pas lisible, car il n'aura aucun moyen d'en obtenir le contenu.Pour que la suppression se produise, le système doit pouvoir lire le contenu et identifier ce qui doit être supprimé.
J'ai essayé de simuler ce que vous tentez:
Si nous essayons de supprimer sans autorisations de lecture, il échoue:
Dans une séquence pour les deux tentatives, la différence est que le contenu du répertoire ne peut pas être lu (getdents):
Avec des autorisations de lecture:
Pour conclure même si vous possédez un répertoire et qu'il a le bit exécutable, vous avez toujours besoin d'autorisations de lecture pour que vous puissiez voir son contenu et supprimer le dossier. Ce n'est pas la même chose pour un fichier.
la source
Eh bien, je n'ai pas assez de réputation pour commenter la réponse de ttaran7, donc ça devrait être une réponse. Mon vote positif n'est pas non plus visible publiquement, en raison de sa faible réputation. J'ai voté en faveur de cette réponse pour avoir réellement inclus une trace d'appel système, plutôt que simplement de la spéculation.
Pour répondre à la question de l'OP: Oui, votre raisonnement était correct: vous êtes bloqué à défaut de lecture du répertoire
J'ai exécuté une trace similaire à ce qu'ils (ttaran7) avaient fait parce que je soupçonnais le même raisonnement: l'
rm
appel échouerait en ne lisant pas le répertoire et ce serait la fin de cela, aucune chance de se plaindre que le répertoire était vide. En jetant un deuxième coup d'œil à la trace que j'ai prise, j'ai remarqué qu'un appel système a été effectué pour tenter de dissocier le nom de fichier fourni de toute façon:Regardez la 4ème ligne:
unlinkat
... qui échoue car le répertoire n'est PAS vide. Maintenant, c'est ce que je considérerais comme un comportement inattendu, le fait qu'il essaie de supprimer le répertoire, bien qu'il n'ait pas d'autorisations de lecture.la source