Bash сбрасывает привилегии при запуске, поэтому вы не часто будете сталкиваться с процессом bash, работающим с разными действующими и реальными UID. Это возможно с другими реализациями sh.
Обратите внимание: если вы хотите проверить, работает ли ваш скрипт от имени пользователя root, проверьте правильность EUID, и вам не нужно заботиться о реальном UID.
И даже проверка EUID часто неверна. Как узнать, что требуется root-доступ? Возможно, все файлы и устройства имеют разрешения, которые позволяют пользователю без полномочий -получить к ним доступ, и если вам нужно использовать некоторые инструменты, которые требуют привилегий, не контролируемых разрешениями на доступ, ваш сценарий может работать с требуемыми возможностями, или может быть имитирован (, т.е. смоделирован в целях тестирования ).
В руководстве вы можете найти:
Operators
Operators join together the other items within the expression.
They include for example -o (meaning logical OR) and -a
(meaning logical AND). Where an operator is missing, -a is
assumed.
Таким образом, буквально \( -perm -0002 -a ! -perm -1000 \)
означает :допуск = 0002, а не допуск = 1000
perm = 0002 означает возможность записи для других
perm = 1000 означает, что установлен липкий бит.
Таким образом, это выражение ищет файл, доступный для записи для другого и без наборов липких битов.
Поиск каталога выполняется с помощью-type d
d
означает каталог, поэтому найдите объект типа каталог
Из руководства по поиску -perm
имеет несколько форм:
-perm 0002
будет соответствовать всем файлам с точно такой же настройкой разрешений -perm -0002
будет соответствовать всем файлам, в которых установлен этот правый бит, (, что означает 0772
, 1752
... любая комбинация, если файл доступен для записи для других)-a
:является логическим И(-o
может использоваться для ИЛИ)\(
,\)
:поскольку круглые скобки имеют особое значение в оболочке, для их экранирования используется косая черта sticky bit
, setuid
,setgid
В -type d \( -perm -0002 -a ! -perm -1000 \)
, во-первых, косая черта выходит за скобки для оболочки, поэтому они могут быть переданы в качестве аргумента вместо того, чтобы интерпретироваться оболочкой как специальные операторы. (Вам понадобится то же самое, например, для. >
, по понятным причинам. )Они могли быть записаны как '('
или "("
, но в итоге find
видит только (
и )
.
Скобки группируют условия, а -a
является конъюнкцией и . Это также неявное значение по умолчанию для условий перехода назад -в -, например, использованное здесь с -type d
и выражением в скобках, их явное -a
не связывает. Выражение точно эквивалентно -type d -perm -0002 ! -perm -1000
. Скобки действительно нужны только с союзом или -o
.
-type d
очевидно, а -perm -NNNN
означает поиск файла с установленными всеми битами разрешения NNNN
. Или, в этом случае, каталоги с установленным разрешением на запись для других (0002
), а бит закрепления(1000
)не установлен (из-за отрицания ). Я думаю, что комбинация здесь также может быть записана как -perm -o+w ! -perm -o+t
. Обратите внимание на тире перед строкой разрешения, без него смысл был бы другим. См., например.справочная страница Linux для find , найдите «(expr )» и «-perm mode».
Доступ на запись к каталогу позволяет создавать, удалять и переименовывать файлы внутри него, а липкий бит предотвращает удаление и переименование файлов, принадлежащих другим пользователям. Все выражение ищет каталоги, в которых любой может удалить или переименовать любые файлы.