Разница между удалением папок с помощью sudo и от имени root

Разница между удалением папок с помощью sudo и от имени root

Сегодня я заметил интересную разницу между выполнением команды с помощью sudo и от имени root.

Использование sudo rm -rf /opt/nextcloud/*не удалит папки

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

Когда я впервые становлюсь пользователем root и затем выполняю команду, папки удаляются

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

Почему так? Как правильно удалить папки с помощью sudo?

решение1

Команда sudo rm -rf /opt/nextcloud/*интерпретируется оболочкой, запущенной от имени вашего обычного пользователя. Оболочка пытается расшириться еще *до sudoзапуска. Если по какой-то причине *расширение невозможно, то команда становится:

  • либо sudo rm -rf /opt/nextcloud/*где sudo(и затем rm) становится /opt/nextcloud/*буквально с литералом *и дальнейшего расширения не происходит; это поведение POSIX; /opt/nextcloud/*очевидно, не существует.
  • или sudo rm -rfв некоторых случаях (например, в Bash, когда nullglobустановлена ​​эта опция).

Есть и другие возможности (например, сравнение failglobв Bash), но они, похоже, не соответствуют вашему случаю.

В любом случае -fвариант rmстановится актуальным. Это означает,

-f
Не запрашивать подтверждение. Не записывать диагностические сообщения и не изменять статус выхода в случае отсутствия файловых операндов или в случае несуществующих операндов. […]

(источник)

Фактически вы указали «операнд, который не существует» или «файловые операнды отсутствуют», поэтому команда ничего не сделала и была выполнена без каких-либо сообщений.


Моя гипотеза заключается в том, что не-повышенная оболочка не может расширяться, /opt/nextcloud/*поскольку у обычного пользователя нет прав на чтение /opt/nextcloud/. Другая возможность заключается в том, что вы допустили опечатку /opt/nextcloud/*и не заметили ее, поскольку не было сообщения об ошибке. Сообщения об ошибке не было, поскольку так и rm -fработает.

sudo ls /opt/nextcloud/не включает в себя расширение оболочкой. Команда запущена lsкак root. lsСама имела доступ к указанному каталогу и его содержимому, поэтому она работала.

После того, как sudo su -вы были в оболочке, запущенной как root. Эта оболочка могла расширяться /opt/nextcloud/*, поэтому rm -rf /opt/nextcloud/*работала так, как вы и ожидали.

Связанный контент