Ошибка Permission denied знакома всем, кто работает с сервером. Сайт не может сохранить загруженную картинку, скрипт не запускается, а программа не читает свой файл настроек. Почти всегда причина в правах доступа. В этой статье разберём, как Linux решает, кому можно читать, изменять и запускать файл, научимся читать права в выводе ls -l, менять их командами chmod и chown и выставлять правильные права для сайта. Все примеры мы выполнили на тестовом сервере с Debian 12.
Как Linux проверяет права
У каждого файла и каждой папки в Linux есть владелец и группа. Когда программа пытается что-то сделать с файлом, система смотрит, от имени какого пользователя эта программа работает, и относит его к одной из трёх категорий. Если это владелец файла, применяются права владельца. Если он не владелец, но входит в группу файла, применяются права группы. Во всех остальных случаях действуют права для остальных пользователей. Проверка идёт строго в таком порядке и останавливается на первой подходящей категории, поэтому владелец с урезанными правами не получит больше только оттого, что группе разрешено больше.
Для каждой категории задаются три права. r разрешает читать, w изменять, x выполнять. У обычного файла смысл очевиден. Право x нужно скриптам и программам, иначе их нельзя запустить, а у текстового файла или картинки оно ни к чему. У папки те же буквы означают другое, и именно здесь чаще всего возникают ошибки. Право r на папку позволяет получить список имён файлов, w позволяет создавать и удалять в ней файлы, а x позволяет войти в папку и обращаться к файлам внутри. Без x не поможет даже право на сам файл. Предположим, что у файла photo.jpg права позволяют владельцу читать его, но у папки uploads, где он лежит, право x снято. Тогда при попытке открыть uploads/photo.jpg система остановится ещё на папке, и программа получит Permission denied. Мы проверили это на тестовом сервере, и как только папке вернули x, файл сразу стал читаться.
Права удобно записывать цифрами. Каждой букве соответствует число, r это 4, w это 2, а x это 1, и права одной категории получаются сложением. Чтение и запись дают 6, чтение и выполнение 5, всё сразу 7. Три цифры подряд задают права владельца, группы и остальных. Так запись 644 означает, что владелец читает и пишет, а все остальные только читают, это обычные права для файлов сайта. Запись 755 даёт владельцу всё, а остальным чтение и вход, так обычно настраивают папки и скрипты. Запись 600 оставляет доступ только владельцу и подходит для файлов с паролями и ключами.
Есть одно исключение из всех этих правил. Пользователь root проверку прав не проходит, ему разрешено читать и менять любые файлы. Поэтому под root всё «работает», а та же программа, запущенная от имени обычного пользователя или веб-сервера, натыкается на запрет. Если что-то работает у вас в терминале, но не работает у сайта, первым делом проверьте, от имени какого пользователя работает сайт и какие права у его файлов.
1. Посмотрите права
Права показывает команда ls -l. Параметр -a добавляет скрытые файлы, имена которых начинаются с точки.
ls -la
Первая колонка показывает тип и права, третья и четвёртая владельца и группу
Разберём строку -rw-r--r-- 1 root root 12 Oct 21 11:55 index.html.
- Первый символ показывает тип.
-это файл,dпапка,lсимволическая ссылка. - Следующие три символа
rw-это права владельца. Он может читать и изменять файл. - Ещё три символа
r--это права группы, она может только читать. - Последние три символа
r--это права остальных пользователей. - root root это владелец и группа файла.
Если удобнее видеть права цифрами, используйте команду stat.
stat -c "%a %U:%G %n" *2. Измените права командой chmod
Права можно задавать цифрами или буквами. Цифры удобны, когда вы точно знаете итоговые права, а буквы когда нужно добавить или убрать одно право, не трогая остальные.
# Разрешить запуск скрипта
chmod +x backup.sh
# Файл с паролями доступен только владельцу
chmod 600 .env
# Папка, в которую может войти только владелец и группа
chmod 750 uploads
backup.sh стал исполняемым, .env закрыт от всех, кроме владельца
В буквенной записи u означает владельца, g группу, o остальных, а a всех сразу. Знак + добавляет право, - убирает, = задаёт точно.
# Убрать у остальных право на чтение
chmod o-r файл
# Задать права точно, как цифрой 750
chmod u=rwx,g=rx,o= uploadsПараметр -R меняет права у папки и всего её содержимого. Пользуйтесь им осторожно, ведь он ставит одинаковые права и папкам, и файлам.
3. Смените владельца командой chown
Команда chown меняет владельца и группу. Через двоеточие указывается сначала пользователь, затем группа, а -R применяет изменение ко всему содержимому папки.
chown -R www-data:www-data /var/www/site
Все файлы сайта теперь принадлежат пользователю www-data
www-data это пользователь, от имени которого в Debian и Ubuntu работают Nginx и Apache. Если сайт должен сам сохранять файлы, например загружать картинки в папку uploads, эта папка должна принадлежать ему. Менять владельца может только root, обычный пользователь получит ошибку Operation not permitted.
4. Выставьте правильные права для сайта
Для сайта обычно хватает простого правила. Папкам ставят 755, файлам 644, а владельцем делают пользователя веб-сервера. Сделать это для всего сайта можно двумя командами find, которые отдельно находят папки и файлы.
find /var/www/site -type d -exec chmod 755 {} +
find /var/www/site -type f -exec chmod 644 {} +Верните права исключениям
Команды выше ставят всем файлам одинаковые 644. На тестовом сервере после них файл .env с паролем снова стал доступен для чтения всем пользователям, а скрипт backup.sh перестал запускаться. Поэтому сразу после массовой смены прав верните исключения, например chmod 600 .env и chmod +x backup.sh.
Почему не стоит ставить 777
Права 777 разрешают всем пользователям сервера читать, изменять и запускать файл. Ошибка Permission denied после этого действительно исчезает, поэтому такой совет часто встречается в интернете. Но вместе с ошибкой исчезает и защита. Если на сервере взломают любой сайт или программу, злоумышленник сможет изменить и ваши файлы, например вписать вредоносный код в страницы сайта. Вместо 777 найдите, от имени какого пользователя работает программа, и сделайте его владельцем нужной папки командой chown.
Частые вопросы
Permission denied при запуске скрипта
У файла нет права на выполнение. Добавьте его командой chmod +x script.sh и запускайте скрипт как ./script.sh. Другой вариант это запустить скрипт через интерпретатор, например bash script.sh, тогда право x не требуется.
Права у файла правильные, а Permission denied остаётся
Проверьте права у всех папок на пути к файлу. Для каждой из них нужно право x для того пользователя, от имени которого работает программа. Удобнее всего это видно командой namei -l /полный/путь/к/файлу, она покажет права каждой папки по пути.

Без права x на папку даже владелец не может открыть файл внутри
chown: changing ownership: Operation not permitted
Менять владельца файла может только root. Выполните команду от имени root или через sudo.
Какие права ставятся новым файлам
Права новых файлов определяет маска umask. На тестовом сервере она равна 0022, поэтому новые файлы получают права 644, а новые папки 755. Посмотреть маску можно командой umask.
Наши ресурсы
Telegram-канал: https://t.me/f3cloud_news
Официальный сайт: https://f3cloud.com