Только владелец файла или пользователь root может изменять права доступа к файлу. Текущие разрешения для файла или его родительского каталога не имеют значения¹. Это указано в POSIX :
Приложение должно гарантировать, что эффективный идентификатор пользователя процесса совпадает с владельцем файла или процесс имеет соответствующие привилегии для этого.
В большинстве устройств «соответствующие привилегии» означают запуск от имени пользователя root. Если эти условия не выполняются, chmod
обычно происходит сбой EPERM
, хотя разрешены другие действия, такие как прерывание программы из-за нарушения безопасности.
Кроме того, некоторые варианты Unix имеют специфичные для системы способы авторизации или запрета chmod
. Например, в Linux есть функция ( CAP_FOWNER
), которая позволяет процессам изменять права доступа к файлу и другие метаданные независимо от его владельца.
Существуют и другие причины, по которым chmod
может произойти сбой, даже если файл существует, доступен и имеет соответствующего владельца. Общие включают файловую систему только для чтения или файловую систему, которая не поддерживает разрешения, такие как FAT. Менее распространенные из них включают специфичные для системы ограничения, такие как неизменяемый атрибут в файловой системе ext2 Linux и его преемники.
¹ За исключением тех случаев, когда запущенный процесс chmod
должен иметь возможность доступа к файлу, поэтому он должен иметь разрешение на выполнение для каталога, содержащего файл, и любого другого каталога, который он проходит для этого.