2

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

2 ответа2

6

причина

Оболочка интерпретирует и расширяет любые символы глобуса (подстановочные знаки), такие как звездочка. Эта интерпретация команды происходит в текущей оболочке (до выполнения команды 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 используется для передачи команды, запускаемой оболочкой. Поскольку команда заключена в кавычки, звездочка не интерпретируется текущей оболочкой и передается новой корневой оболочке, что позволяет ей расширять имена путей перед запуском команды rm .

1

Это либо проблема с именами ваших файлов, либо возможные пробелы в именах файлов.

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

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

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

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

    chattr -i ab*
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .