Что означает ошибка EACCES
Ошибка EACCES (также отображаемая как Permission denied) появляется, когда в Linux не удается изменить права доступа к файлу. Типичный текст сообщения:
chmod: cannot change permissions: Operation not permitted
Обычно это происходит, когда текущий пользователь не имеет необходимых привилегий, владелец файла или группа не совпадают, или действуют правила безопасности (SELinux/AppArmor). Ошибка может возникать как при использовании chmod, так и при попытке выполнения скрипта или доступа к системному ресурсу.
Причины возникновения
- Недостаток прав пользователя – команда выполняется не от имени root или с insufficient правами sudo.
- Несовпадение владельца/группы – файл принадлежит другому пользователю, и текущая группа не имеет прав на изменение.
- Ограничительный бит umask – маска прав может блокировать установку необходимых прав доступа.
- Контекст безопасности SELinux/AppArmor – системные политики запрещают изменение атрибутов файла.
- Повреждённый inode или файловая система – редко, но также может вызывать ошибку доступа.
Способы решения
Способ 1: Использование sudo для повышения привилегий
Если вам не хватает прав, запустите chmod с sudo:
sudo chmod <options> <filename>
Например, чтобы открыть доступ на запись для владельца:
sudo chmod u+rwx /path/to/file
💡 Совет: Если вы регулярно работаете с правами, добавьте
sudoв группу пользователей в/etc/sudoers, но делайте это осторожно.
Способ 2: Изменение владельца или группы файла
Когда файл принадлежит другому пользователю, измените владельца (или группу) перед изменением прав:
sudo chown user:group /path/to/file
sudo chmod <options> /path/to/file
⚠️ Важно: После изменения владельца убедитесь, что новая группа имеет необходимые разрешения.
Способ 3: Проверка и корректировка umask
Проверьте текущую маску прав:
umask
Если маска блокирует установку прав (например, 077), временно сбросьте её:
umask 022
Для постоянного изменения отредактируйте ~/.bashrc или /etc/profile.
Способ 4: Отключение или корректировка контекста SELinux/AppArmor
Для систем с SELinux:
sudo setsebool -P allow_execmod 1
Для AppArmor отключите профиль (если он не критичен):
sudo aa-teardown /etc/apparmor.d/usr.bin.python
🔎 Примечание: В продакшене изменяйте политики безопасности только после оценки рисков.
Способ 5: Восстановление доступа через ACL
Если стандартных прав недостаточно, используйте ACL для granularity:
sudo setfacl -m u:username:rwX /path/to/file
sudo chmod -R a+rX /path/to/file
Профилактика
- Используйте sudo только для необходимых команд; не запускайте
chmodот имени обычного пользователя, если вам действительно нужны права администратора. - Регулярно проверяйте ненужные SETUID- или SETGID- файлы:
find / -type f -perm /4000 -ls. - Следите за контекстом безопасности (
getsebool,aa-status) и обновляйте правила, если они становятся слишком ограничительными. - Обновляйте систему и ядро – новые версии часто исправляют баги, связанные с правами доступа.
Эти простые привычки помогут избежать ошибки EACCES в будущем и сохранить порядок в файловой системе.