Linux: Permission denied при записи файла в каталог

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Для записи в каталог нужны права на запись для владельца, группы или остальных. Ниже — причины и порядок действий от простого к сложному.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Диагностика
  5. Исправление
  6. Особые случаи

#Что означает ошибка

Сообщение
bash: file.txt: Permission denied

Permission denied при записи файла в Linux означает, что у вашего пользователя нет права записи на файл или каталог. Для создания и удаления файлов нужны права на каталог, а не только на файл. Причина — владелец, группа, режим доступа, ACL, атрибут immutable или SELinux.

Диагностика начинается с ls -l и id.

Выдавайте минимально необходимые права, а не chmod 777.

Для записи в каталог нужны права на запись для владельца, группы или остальных. Проверьте владельца и права командой ls -l.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Нет прав на каталогЧужой каталог.Выдайте права или используйте sudo.
Файловая система только для чтенияРежим ro.Перемонтируйте.
Файл принадлежит другому пользователюВладелец.Смените владельца.
SELinux или AppArmorПолитики.Проверьте.

#Пошаговое решение

  1. Проверьте права и владельцаВ терминале сервера выполните ls -ld ПУТЬ_К_КАТАЛОГУ и ls -l ПУТЬ_К_ФАЙЛУ, подставив пути из сообщения об ошибке. В выводе посмотрите владельца, группу и разрешения. Затем уточните, от какого пользователя работает служба (systemctl show ИМЯ_СЛУЖБЫ -p User для службы systemd). Изменяйте владельца или права только после определения правильного значения; не выставляйте 777 ради обхода ошибки.
  2. Проверьте путь целикомВ терминале выполните namei -l /полный/путь/к/файлу, заменив пример реальным путём из ошибки. Команда покажет права на каждый каталог по пути: для прохода через каталог необходимо право x, для создания файла — w и x в родительском каталоге. Если имя команды не найдено, можно последовательно проверить ls -ld для каталога и его родителей. Исправляйте права только на собственные файлы, а не рекурсивно по всей системе.
  3. Назначьте владельца или группуСначала выполните ls -ld /реальный/каталог и id, чтобы определить владельца, группу и членство пользователя. Если каталог должен принадлежать текущему пользователю и это подтверждено администратором, можно изменить только его, указав фактические имена: sudo chown ИМЯ_ПОЛЬЗОВАТЕЛЯ:ИМЯ_ГРУППЫ /реальный/каталог. Уточните путь до запуска и не используйте chown -R для /, /etc, домашней папки другого пользователя или общего каталога без плана отката. Если доступ обеспечивается группой, лучше согласовать групповое разрешение.
  4. Проверьте ACL, SELinux и атрибутыЕсли обычные права выглядят корректно, выполните getfacl /реальный/путь (если установлен пакет acl), lsattr /реальный/путь для файловых систем, поддерживающих атрибуты, и getenforce на системах с SELinux. Вывод ACL может содержать явный запрет доступа, атрибут i запрещает изменения, а SELinux Enforcing может блокировать обращение при правильных UNIX-правах. Не выключайте SELinux и не снимайте атрибут i без понимания, кто и зачем его установил.
  5. Используйте sudo tee для записиЕсли нужно один раз записать конфигурационный файл от имени администратора, обычное перенаправление sudo echo ... > /etc/file не поможет: > выполняется вашей оболочкой. Безопаснее использовать редактор sudoedit /реальный/файл или передать проверенное содержимое в sudo tee /реальный/файл с вводом из подготовленного файла. Перед перезаписью сохраните копию исходной конфигурации; убедитесь, что файл относится к вашей системе и вы понимаете последствия записи.
  6. Права на каталог
    Linux · Терминал (Bash)Команда
    Права на каталог.
    ls -ld /path/to/dir

#Диагностика

Выполните ls -ld /путь/к/каталогу /путь/к/файлу и id. Смотрите владельца, группу и права (rwxr-xr-x). Проверьте путь целиком: namei -l /путь/к/файлу — запись нужна на каталог, а ещё x на всех родительских каталогах. Проверьте, не смонтирована ли файловая система только для чтения (mount | grep " ro,"), нет ли атрибута i: lsattr файл.

#Исправление

Сначала выполните id, ls -ld для целевого каталога и namei -l для полного пути. Для обычного файла меняйте владельца только после того, как выяснили, под какой учётной записью выполняется программа и какие права действительно нужны. Не используйте массовое sudo chown -R www-data:www-data /var/www/site: оно может сломать права владельца, конфигурации и секретные файлы сайта. При нехватке прав из-за групп проверьте членство, при ACL — getfacl и при необходимости индивидуальное правило. Для серверных каталогов согласуйте изменения с администратором и сохраните текущие разрешения до правки.

#Особые случаи

ACL: getfacl файл и setfacl -m u:user:rwX файл. SELinux: ls -Z, ausearch -m avc -ts recent, restorecon -Rv /путь. Для записи в защищённые места используйте sudo tee: echo text | sudo tee /etc/file. Перенаправление sudo echo > file не работает, потому что > выполняется вашим пользователем. Для Docker-томов сопоставьте UID контейнера и владельца на хосте.

Linux · Терминал (Bash)Команда
Не переименовывайте владельца всего сайта рекурсивно; сначала изучите права пути и конкретного файла. Запуск: терминал Linux с правами, указанными в команде. Сначала проверьте имя устройства и целевой путь.
namei -l /var/www/site/data.db

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.