
Сегодня я заметил интересную разницу между выполнением команды с помощью 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/*
работала так, как вы и ожидали.