Eliminar archivos de un directorio de propiedad raíz usando sudo con comodines

Eliminar archivos de un directorio de propiedad raíz usando sudo con comodines

Digamos que tengo una carpeta /var/log/nginxque está protegida (propiedad de root y nadie más puede leer ni escribir en ella). Incluso usando sudo, no puedo prescindir sudo rm -f /var/log/nginx/ab*de que aparezca "No existe tal archivo o directorio". ¿Tengo que cargar un shell raíz para hacer esto o hay alguna otra manera?

Respuesta1

Causa

El shell interpreta y expande cualquier carácter global (comodín) como el asterisco. Esta interpretación del comando ocurre en el shell actual (antes de que sudose ejecute el comando) que no tiene permiso de lectura para el directorio. Dado que el shell actual no puede encontrar archivos que coincidan con el patrón global, la expansión del nombre de ruta no se lleva a cabo y el shell pasa rm, -fy /var/log/nginx/ab*(con un asterisco literal) como argumentos del sudocomando.

El sudocomando, a su vez, inicia el rmcomando que intenta eliminar un archivo con una ruta de /var/log/nginx/ab*(un asterisco es un carácter legal para un nombre de archivo Unix). Como dicho archivo en realidad no existe, informa de su error. Con GNU rm, este mensaje de error es explícito; elllenoEl siguiente mensaje de error indica que el archivo (único) que se está eliminando no existe:

rm: cannot remove `/var/log/nginx/ab*': No such file or directory

Solución

La solución es iniciar un nuevo shell como superusuario con los permisos necesarios para realizar la expansión del nombre del archivo:

sudo bash -c "rm -f /var/log/nginx/ab*"

El comando anterior inicia un nuevo shell que se ejecuta como root y la -copción se usa para pasar el comando que ejecutará el shell. Dado que el comando está entre comillas, el shell actual no interpreta el asterisco y se pasa tal cual al nuevo shell raíz, lo que le permite expandir las rutas antes de ejecutar el rmcomando.

Respuesta2

Es un problema con los nombres de sus archivos o posibles espacios en sus nombres de archivos.

Pruebe las siguientes soluciones:

  1. Intente preceder --para indicar el final de las opciones, por ejemplo:

    sudo rm -vf -- /var/log/nginx/ab*
    
  2. Usar find:

    sudo find /var/log/nginx -name "ab*" -print -delete
    
  3. Si cree que sus archivos están protegidos en Linux, intente eliminar la protección primero:

    chattr -i ab*
    

información relacionada