Diferencia entre eliminar carpetas usando sudo o como root

Diferencia entre eliminar carpetas usando sudo o como root

Hoy noté una diferencia interesante entre ejecutar un comando usando sudo o como root.

Usar sudo rm -rf /opt/nextcloud/*no eliminará carpetas

vagrant@collab:~$ sudo rm -rf /opt/nextcloud/*
vagrant@collab:~$ sudo ls /opt/nextcloud/
nextcloud  nextcloud-16.0.4

Cuando me convierto en root por primera vez y luego ejecuto el comando, las carpetas se eliminan

vagrant@collab:~$ sudo su -
root@collab:~# rm -rf /opt/nextcloud/*
root@collab:~# sudo ls /opt/nextcloud/
root@collab:~# 

¿Por qué es esto? ¿Cuál es la forma correcta de eliminar las carpetas usando Sudo?

Respuesta1

El comando sudo rm -rf /opt/nextcloud/*es interpretado por el shell que se ejecuta como su usuario habitual. El shell intenta expandirse incluso *antes sudode ejecutarse. Si por alguna razón *no se puede expandir, entonces el comando se convierte en:

  • ya sea sudo rm -rf /opt/nextcloud/*donde sudo(y luego rm) llega /opt/nextcloud/*literalmente con el literal *y no se produce ninguna expansión adicional; este es el comportamiento POSIX; /opt/nextcloud/*obviamente no existe.
  • o sudo rm -rfen algunas circunstancias (por ejemplo, en Bash cuando la nullglobopción está configurada).

Hay otras posibilidades (por ejemplo, comparar failgloben Bash) pero parecen no coincidir con su caso.

En cualquier caso la -fopción de rmcobra relevancia. Significa

-f
No solicite confirmación. No escriba mensajes de diagnóstico ni modifique el estado de salida en el caso de que no haya operandos de archivo o en el caso de operandos que no existan. […]

(fuente)

Efectivamente, proporcionó un "operando que no existe" o "ningún operando de archivo", por lo que el comando no hizo nada y tuvo éxito en silencio.


Mi hipótesis es que el shell no elevado no se pudo expandir /opt/nextcloud/*porque el usuario normal no tiene permisos de lectura /opt/nextcloud/. Otra posibilidad es que cometiste un error tipográfico /opt/nextcloud/*y no lo detectaste porque no había ningún mensaje de error. No hubo ningún mensaje de error porque así es como rm -ffunciona.

sudo ls /opt/nextcloud/no implica expansión por parte del caparazón. El comando se ejecuta lscomo root. El lsmismo tenía acceso al directorio especificado y a su contenido, por lo tanto funcionó.

Después sudo su -estabas en un shell ejecutándote como root. Este shell pudo expandirse /opt/nextcloud/*, por lo que rm -rf /opt/nextcloud/*funcionó como esperaba.

información relacionada