1

У меня действительно странная проблема. У меня есть несколько файлов в большом каталоге, которые я хочу сделать доступными для чтения всем. Итак, я пытаюсь это:

sudo find readme* -not -perm -o+r -exec chmod +r {} \;

и получите это:

sudo: unable to execute /usr/bin/find: Success

Я не знаю, почему это говорит Успех, потому что разрешения не были изменены. Я подтвердил, набрав это:

find readme* -not -perm -o+r -exec ls -l {} \;

и получить что-то вроде

-rw------- 1 root root 536871076 Nov 22 14:06 readme_20101122200429
-rw------- 1 root root 536871892 Nov 22 14:08 readme_20101122200642
-rw------- 1 root root 293458128 Nov 22 14:10 readme_20101122200859

в крайнем случае я попытался:

sudo chmod +r *

и получил:

sudo: unable to execute /bin/chmod: Success

и снова успех действительно означает неудачу. Итак, я сдался и вошел в систему как root и попытался:

find readme* -not -perm -o+r -exec chmod +r {} \;

На этот раз это сработало. Зачем?

РЕДАКТИРОВАТЬ: /etc /sudoers выглядит так:

## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL

##Me
user1   ALL=(ALL)       ALL

2 ответа2

4

Я не знаю, какую версию находки вы используете. Но, как правило, первый аргумент - это каталог, в котором нужно найти, и если вы хотите фильтровать некоторые имена файлов, вы должны использовать аргумент -name. Мое предположение будет

Судо найти. -name 'readme *' -not -perm -o+r -exec chmod +r {} \;

Не забудьте заключить в кавычки шаблон имени файла. Если вы этого не сделаете, * будет оценен оболочкой и не будет передан непосредственно в качестве аргумента. Это может объяснить странное поведение. Потому что в этом случае, вероятно, оболочка пытается передать каждое имя файла, совпадающее с readme *, в качестве аргумента для sudo.

3

Я думаю, что вы должны использовать:

sudo sh -c 'find readme* -not -perm -o+r -exec chmod +r {} \;'

Это заставляет sudo запускать оболочку, которая затем интерпретирует аргумент -c как скрипт оболочки. Использовать одинарные кавычки проще всего - если только в команде нет одинарных кавычек. В этом случае каждая отдельная кавычка в команде заменяется четырьмя символами - '\'': кавычка, обратная косая черта, кавычка, кавычка.

Однако в контексте я бы не хотел гарантировать, что вы не получите:

sudo: unable to execute /bin/sh: Success

Нечетная ошибка, вероятно, означает, что был возвращен вызов функции семейства exec*() , но значение, оставленное в errno было равно нулю. Этого не должно случиться - но, очевидно, так и произошло. Что происходит с:

sudo /bin/ls      # Or /usr/bin/ls if that's correct for your machine

Когда вы последний раз проверяли установку sudo ? Когда вы последний раз перезагружались? Похоже, что-то не так в том, как sudo (неправильно) обрабатывает команды для вас.

Смонтирован ли каталог, с которым вы работаете, в NFS? Root обычно имеет довольно минимальные привилегии в таких каталогах. Но ошибка должна относиться к разновидности EPERM (без разрешения), а не к категории «успех при неудаче».

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