
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 sudo
de ejecutarse. Si por alguna razón *
no se puede expandir, entonces el comando se convierte en:
- ya sea
sudo rm -rf /opt/nextcloud/*
dondesudo
(y luegorm
) 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 -rf
en algunas circunstancias (por ejemplo, en Bash cuando lanullglob
opción está configurada).
Hay otras posibilidades (por ejemplo, comparar failglob
en Bash) pero parecen no coincidir con su caso.
En cualquier caso la -f
opción de rm
cobra 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 -f
funciona.
sudo ls /opt/nextcloud/
no implica expansión por parte del caparazón. El comando se ejecuta ls
como root. El ls
mismo 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.