Удаляйте файлы из корневого каталога, используя sudo с подстановочными знаками

Удаляйте файлы из корневого каталога, используя sudo с подстановочными знаками

Допустим, у меня есть /var/log/nginxзащищенная папка (принадлежит root, и никто другой не может читать или писать в нее). Даже используя sudo, я не могу обойтись sudo rm -f /var/log/nginx/ab*без сообщения "Нет такого файла или каталога". Нужно ли мне загружать оболочку root, чтобы сделать это, или есть какой-то другой способ?

решение1

Причина

Оболочка интерпретирует и расширяет любые символы glob (подстановочные знаки), такие как звездочка. Эта интерпретация команды происходит в текущей оболочке (до sudoвыполнения команды), которая не имеет разрешения на чтение каталога. Поскольку текущая оболочка не может найти файлы, соответствующие шаблону glob, расширение имени пути не выполняется, и оболочка передает rm, -fи /var/log/nginx/ab*(с буквальным символом звездочка) в качестве аргументов команды sudo.

Команда sudo, в свою очередь, запускает rmкоманду, которая пытается удалить файл с путем /var/log/nginx/ab*(звездочка является допустимым символом для имени файла Unix). Поскольку такой файл на самом деле не существует, она сообщает о своей неудаче. В GNU rmэто сообщение об ошибке явное;полныйСообщение об ошибке ниже указывает на то, что удаляемый (отдельный) файл не существует:

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

Решение

Решение состоит в запуске новой оболочки от имени суперпользователя с необходимыми разрешениями для выполнения расширения имени файла:

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

Приведенная выше команда запускает новую оболочку, которая запускается как root, а -cопция используется для передачи команды, которая будет запущена оболочкой. Поскольку команда заключена в кавычки, звездочка не интерпретируется текущей оболочкой и передается как есть в новую оболочку root, позволяя ей расширить пути перед запуском команды rm.

решение2

Проблема либо в именах файлов, либо в наличии пробелов в именах файлов.

Поэтому попробуйте следующие обходные пути:

  1. Попробуйте использовать предыдущее --, чтобы обозначить конец вариантов, например:

    sudo rm -vf -- /var/log/nginx/ab*
    
  2. Использовать find:

    sudo find /var/log/nginx -name "ab*" -print -delete
    
  3. Если вы считаете, что ваши файлы защищены в Linux, попробуйте сначала снять защиту:

    chattr -i ab*
    

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