#Что означает ошибка
bash: file.txt: Permission denied
Permission denied при записи файла в Linux означает, что у вашего пользователя нет права записи на файл или каталог. Для создания и удаления файлов нужны права на каталог, а не только на файл. Причина — владелец, группа, режим доступа, ACL, атрибут immutable или SELinux.
Диагностика начинается с ls -l и id.
Выдавайте минимально необходимые права, а не chmod 777.
Для записи в каталог нужны права на запись для владельца, группы или остальных. Проверьте владельца и права командой ls -l.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет прав на каталог | Чужой каталог. | Выдайте права или используйте sudo. |
| Файловая система только для чтения | Режим ro. | Перемонтируйте. |
| Файл принадлежит другому пользователю | Владелец. | Смените владельца. |
| SELinux или AppArmor | Политики. | Проверьте. |
#Пошаговое решение
- Проверьте права и владельцаВ терминале сервера выполните
ls -ld ПУТЬ_К_КАТАЛОГУиls -l ПУТЬ_К_ФАЙЛУ, подставив пути из сообщения об ошибке. В выводе посмотрите владельца, группу и разрешения. Затем уточните, от какого пользователя работает служба (systemctl show ИМЯ_СЛУЖБЫ -p Userдля службы systemd). Изменяйте владельца или права только после определения правильного значения; не выставляйте777ради обхода ошибки. - Проверьте путь целикомВ терминале выполните
namei -l /полный/путь/к/файлу, заменив пример реальным путём из ошибки. Команда покажет права на каждый каталог по пути: для прохода через каталог необходимо правоx, для создания файла —wиxв родительском каталоге. Если имя команды не найдено, можно последовательно проверитьls -ldдля каталога и его родителей. Исправляйте права только на собственные файлы, а не рекурсивно по всей системе. - Назначьте владельца или группуСначала выполните
ls -ld /реальный/каталогиid, чтобы определить владельца, группу и членство пользователя. Если каталог должен принадлежать текущему пользователю и это подтверждено администратором, можно изменить только его, указав фактические имена:sudo chown ИМЯ_ПОЛЬЗОВАТЕЛЯ:ИМЯ_ГРУППЫ /реальный/каталог. Уточните путь до запуска и не используйтеchown -Rдля/,/etc, домашней папки другого пользователя или общего каталога без плана отката. Если доступ обеспечивается группой, лучше согласовать групповое разрешение. - Проверьте ACL, SELinux и атрибутыЕсли обычные права выглядят корректно, выполните
getfacl /реальный/путь(если установлен пакет acl),lsattr /реальный/путьдля файловых систем, поддерживающих атрибуты, иgetenforceна системах с SELinux. Вывод ACL может содержать явный запрет доступа, атрибутiзапрещает изменения, а SELinux Enforcing может блокировать обращение при правильных UNIX-правах. Не выключайте SELinux и не снимайте атрибутiбез понимания, кто и зачем его установил. - Используйте sudo tee для записиЕсли нужно один раз записать конфигурационный файл от имени администратора, обычное перенаправление
sudo echo ... > /etc/fileне поможет:>выполняется вашей оболочкой. Безопаснее использовать редакторsudoedit /реальный/файлили передать проверенное содержимое вsudo tee /реальный/файлс вводом из подготовленного файла. Перед перезаписью сохраните копию исходной конфигурации; убедитесь, что файл относится к вашей системе и вы понимаете последствия записи. - Права на каталог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 контейнера и владельца на хосте.
namei -l /var/www/site/data.db