#Что означает ошибка
Permission denied
Сообщение Permission denied в Linux означает, что у процесса нет нужного разрешения на чтение, запись или выполнение объекта. Система прав в Linux построена на трёх категориях владельцев (пользователь, группа, остальные) и трёх типах доступа (r, w, x). Чтобы войти в каталог, нужно право x именно на каталог, а не только на файл внутри.
Многие новички решают проблему командой chmod 777, потому что она «работает». Но она открывает файл всем пользователям системы, а на веб-сервере позволяет злоумышленнику записать вредоносный код в каталог сайта. Правильно — выяснить, кто и что должен делать, и выдать минимально достаточные права.
Выдайте минимально необходимые права, не используйте 777.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| ВладелецНе тот. | Проявляется как «Permission denied» или близкий по смыслу сбой. | chown. |
| ПраваМало. | Проявляется как «Permission denied» или близкий по смыслу сбой. | chmod. |
| SELinux/AppArmorПолитика. | Проявляется как «Permission denied» или близкий по смыслу сбой. | Проверьте. |
| КаталогНет x. | Проявляется как «Permission denied» или близкий по смыслу сбой. | Добавьте. |
#Пошаговое решение
- Проверьте праваВ терминале выполните
id, затемls -ld -- ПУТЬдля реального файла или каталога (вместоПУТЬподставьте путь из ошибки, в кавычках при пробелах). Чтобы увидеть права всех промежуточных каталогов, выполнитеnamei -l -- ПУТЬ. По выводу определите, кому принадлежат файлы и есть ли право прохода (x) по каталогам. Не назначайте777и не меняйте владельца рекурсивно без понимания роли файлов. - Смените владельцаОткройте терминал и выясните фактического владельца:
ls -ld -- /фактический/путьиid. Если у файла должен быть другой владелец, согласуйте это с администратором и меняйте только конкретный файл:sudo chown ИМЯ_ПОЛЬЗОВАТЕЛЯ:ИМЯ_ГРУППЫ /фактический/файл, подставляя реально существующую учётную запись и путь. Не используйтеchown -Rдля системных каталогов и сайтов по примеру: рекурсивная замена может сломать владельцев, защищённые файлы и работу сервера. При ошибке доступа к корпоративным данным сначала запросите права, а не захватывайте владение. - Выдайте праваПроверьте
namei -l -- /фактический/путь: для доступа к файлу нужны права на сам файл и право проходаxпо каждому родительскому каталогу. Не назначайте всемchmod 777илиchmod -R 755: это может открыть секреты. Если файл должен читать только владелец, достаточно режима 600; если он предназначен для обычного чтения, режим 644 может подходить, но зависит от задачи. Для конкретного сценария согласуйте нужную группу и ACL (getfacl /фактический/путь, если утилита есть). После изменения повторите исходную операцию от того же пользователя и при неудаче запишите точный отказ.
#Если не помогло
Не выдавайте 777 на каталоги сайта: это снижает безопасность.
#Как прочитать права
Команда ls -l показывает строку вида -rw-r--r--: первый символ — тип объекта, затем три тройки для владельца, группы и остальных. Число 644 означает rw- для владельца и r-- для остальных; 755 — rwx для владельца и r-x для остальных; 600 — доступ только владельцу. Для каталогов нужен бит x, иначе внутрь не зайти.
#Типовые правильные значения
Файлы сайта — 644, каталоги — 755, закрытые ключи и конфиги с паролями — 600, каталог ~/.ssh — 700. Владельца задают командой chown, а для общего доступа удобнее добавить пользователей в группу и выдать групповые права, чем открывать доступ всем.
#Когда проблема не в chmod
Если права выглядят правильно, а доступ запрещён, проверьте SELinux или AppArmor, флаг immutable (lsattr), монтирование диска только для чтения и ACL (getfacl). Для сетевых и контейнерных томов часто важно совпадение идентификаторов UID и GID, а не имён пользователей.
ls -ld /var/www/site && namei -l /var/www/site/index.phpnamei -l /var/www/site