Tengo una carpeta con -wx
permisos llamados folder1
y otra carpeta dentro llamada folder2
con rwx
permisos.
Traté de eliminar folder1
usando este comando:
rm -r folder1
Pero recibí el siguiente error:
rm: cannot remove 'folder1': Permission denied
La razón por la que creo que recibí este error es porque el rm
programa primero necesita obtener el contenido de folder1
(obtener los nombres de los archivos y carpetas folder1
que están dentro ) para poder eliminar ese contenido (porque no puede eliminar un archivo o carpeta sin saber su nombre, creo), y luego el rm
programa puede eliminarse folder1
solo.
Pero como folder1
no tiene el read
permiso, el rm
programa no puede obtener su contenido y, por lo tanto, no puede eliminar su contenido, y dado que no puede eliminar su contenido, no puede eliminarlo.
¿Estoy en lo correcto?
fuente
Respuestas:
Creo que su análisis es correcto: no puede eliminar el directorio ya que no está vacío, y no puede vaciarlo ya que no puede ver su contenido.
Solo lo intenté:
Cuando escribí "usted", me refería a cualquier programa que pueda ejecutar. Su
rm -r
comando primero ve quefolder1
es un directorio, por lo que intenta descubrir su contenido para vaciarlo, pero falla por faltar el permiso de lectura, luego intenta eliminarlo pero falla porque no está vacío. El "Permiso denegado" es engañoso; Creo que "Directorio no vacío" (comormdir
informes) sería más apropiado).fuente
Directory not empty
en este caso ya que no sabría que está vacío o no. Aún recibirá el mismo error cuando intente eliminar un directorio vacío en el que no tiene permisos de lectura. (Además, ignore mi comentario anterior, no tenía puesto mi límite de pensamiento).rmdir
puede informar "Directorio no vacío". Y si lees mi prueba, verás que acepta eliminar elfolder1
directorio, sin permiso de lectura , una vez que lo haya vaciado.Permission denied
cuando intentorm -r folder1
cuando está vacío. Estoy en OpenBSD, no en Linux.-r
se usa, cada entrada de directorio (excepto para.
y..
) debe eliminarse como si fuera un operando de archivorm -r
. Parece que GNUrm
simplemente hace unrmdir()
en el directorio si no es legible, porque no tendrá forma de obtener el contenido del mismo.Para que se produzca la eliminación, el sistema debe poder leer el contenido e identificar lo que se debe eliminar.
He intentado simular lo que estás intentando:
Si intentamos eliminar sin permisos de lectura, falla:
En una secuencia para los dos intentos, la diferencia es que el contenido del directorio no se puede leer (getdents):
Con permisos de lectura:
Para concluir, incluso si posee un directorio y tiene el bit ejecutable, aún necesita permisos de lectura para que pueda ver su contenido y eliminar la carpeta. Sin embargo, no es lo mismo para un archivo.
fuente
Bueno, no tengo suficiente reputación para comentar la respuesta de ttaran7, por lo que parece una respuesta que tendrá que ser. Mi voto positivo tampoco es visible públicamente, debido a la baja reputación. He votado esa respuesta por incluir realmente un seguimiento de llamadas del sistema, en lugar de solo especulaciones.
Para responder la pregunta del OP: Sí, su razonamiento era correcto: se bloquea al no leer el directorio
Hice un seguimiento similar a lo que ellos (ttaran7) habían hecho porque sospechaba el mismo razonamiento: la
rm
llamada fallaría al no leer el directorio y eso sería el final de eso, no hay posibilidad de quejarse de que el directorio esté vacío. Al echar un segundo vistazo al rastro que hice, noté que se realizó una llamada al sistema para intentar desvincular el nombre de archivo proporcionado de todos modos:Mire la cuarta línea:
unlinkat
... que falla porque el directorio NO está vacío. Ahora, eso es lo que consideraría un comportamiento inesperado, el hecho de que intenta eliminar el directorio, a pesar de no tener permisos de lectura.fuente