Linux EACCESВысокая

Решение ошибки EACCES в Linux: как исправить Permission denied

Эта статья объясняет, что означает ошибка EACCES в Linux, её причины и предоставляет несколько способов решения, чтобы восстановить доступ к файлам и командам.

Обновлено 16 февраля 2026 г.
5-10 мин
Низкая
FixPedia Team
Применимо к:Ubuntu 20.04+Debian 10+CentOS 7+Fedora 35+

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

Ошибка EACCES — это стандартный код ошибки в Linux и других UNIX-подобных системах, который переводится как "Permission denied" (Доступ запрещён). Она возникает, когда процесс (например, команда или программа) пытается выполнить операцию (чтение, запись, выполнение) над файлом или директорией, но у текущего пользователя недостаточно прав для этого.

Полный текст ошибки обычно выглядит так:

bash: ./script.sh: Permission denied

или

touch: cannot touch '/path/to/file': Permission denied

Ошибка может появиться в различных контекстах: при запуске скриптов, доступе к системным файлам, работе с сетевыми ресурсами или даже при использовании некоторых команд (sudo, apt и др.).

Причины возникновения

Ошибка EACCES имеет конкретные технические причины. Вот основные из них:

  1. Недостаточные права доступа у текущего пользователя
    Файл или директория не имеют необходимых битов доступа (read, write, execute) для вашего пользователя или группы.
  2. Файл принадлежит другому пользователю или группе
    Владелец файла — другой пользователь (например, root), и вы не входите в группу, имеющую права.
  3. Отсутствует execute бит для скриптов или бинарников
    При попытке запустить скрипт или программу без права на выполнение (x).
  4. Файловая система смонтирована с опциями, ограничивающими доступ
    Например, опция noexec запрещает выполнение файлов на смонтированном устройстве, а nosuid отключает setuid биты.
  5. SELinux или AppArmor блокируют доступ
    Механизмы безопасности могут запрещать доступ даже при корректных правах POSIX.
  6. Атрибуты файла, такие как immutable (chattr +i)
    Файл помечен как неизменяемый, и любые операции (даже от root) запрещены.
  7. Директория в пути lacks execute permission
    Для доступа к файлу необходимо иметь execute право на все директории в пути. Если хотя бы одна директория недоступна, возникает EACCES.

Способы решения

Способ 1: Изменение прав доступа с помощью chmod

Чаще всего ошибка решается добавлением необходимых прав через команду chmod. Сначала проверьте текущие права:

ls -l /путь/к/файлу

Вывод будет выглядеть так: -rw-r--r-- 1 user group 123 Feb 16 12:00 file.txt. Здесь:

  • Первые 9 символов: права для владельца (user), группы (group) и остальных (others).
  • r = read, w = write, x = execute.

Примеры исправлений:

  • Добавить execute право для владельца (чтобы запустить скрипт):
    chmod u+x /путь/к/файлу
    
  • Добавить read и write для группы:
    chmod g+rw /путь/к/файлу
    
  • Дать все права всем (используйте осторожно, только для временных решений или общих ресурсов):
    chmod 777 /путь/к/файлу
    
  • Установить конкретные права числовым режимом (например, 755 для владельца: rwx, группа и другие: r-x):
    chmod 755 /путь/к/файлу
    

⚠️ Важно: Избегайте постоянного использования chmod 777 на системных или чувствительных файлах — это серьёзная уязвимость безопасности.

Способ 2: Смена владельца файла с помощью chown

Если файл принадлежит другому пользователю (например, root), и вы должны им регулярно пользоваться, смените владельца. Требуются права sudo.

# Сменить владельца на текущего пользователя и его группу
sudo chown $USER:$(id -gn) /путь/к/файлу

# Или явно указать пользователя и группу
sudo chown alice:developers /путь/к/файлу

Для рекурсивного изменения владельца всей директории:

sudo chown -R $USER:$(id -gn) /путь/к/директории

Способ 3: Использование sudo для повышения привилегий

Если вам необходимо разово выполнить команду, требующую повышенных прав (например, доступ к системному файлу), используйте sudo:

sudo cat /etc/shadow
sudo systemctl restart service

Однако для скриптов или программ, которые нужно запускать часто, лучше настроить права (как в Способе 1) вместо постоянного использования sudo, чтобы избежать рисков.

Способ 4: Проверка и настройка SELinux/AppArmor

На дистрибутивах, использующих SELinux (CentOS, RHEL, Fedora) или AppArmor (Ubuntu, Debian), эти системы могут блокировать доступ даже при правильных правах POSIX.

Для SELinux:

  1. Проверьте контекст SELinux файла:
    ls -Z /путь/к/файлу
    

    Вывод: -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 file.txt. Контекст после : важен.
  2. Если контекст некорректный (например, для веб-файлов должен быть httpd_sys_content_t), восстановите:
    sudo restorecon -v /путь/к/файлу
    

    Или установите вручную:
    sudo chcon -t httpd_sys_content_t /путь/к/файлу
    
  3. Для диагностики смотрите логи: sudo ausearch -m avc -ts recent.

Для AppArmor:

  1. Проверьте активные профили:
    sudo aa-status
    
  2. Если приложение заблокировано, можно временно отключить профиль (не рекомендуется для production):
    sudo aa-disable /path/to/app
    

    Или отредактировать профиль в /etc/apparmor.d/.

Способ 5: Проверка атрибутов файла (chattr)

Файл может иметь атрибут immutable (i) или append-only (a), который запрещает любые изменения, даже от root.

  1. Проверьте атрибуты:
    lsattr /путь/к/файлу
    

    Вывод: ----i-------- /путь/к/файлу — флаг i означает immutable.
  2. Удалите атрибут (требует sudo):
    sudo chattr -i /путь/к/файлу
    

    Для рекурсивного удаления атрибута с директории:
    sudo chattr -R -i /путь/к/директории
    

Способ 6: Проверка опций монтирования файловой системы

Если файл находится на отдельном устройстве (например, USB-накопитель или сетевой раздел), проверьте, как смонтирована файловая система:

mount | grep /путь/к/файлу

Пример вывода: /dev/sdb1 on /mnt/usb type vfat (rw,nosuid,nodev,noexec,relatime,uid=1000,gid=1000,...)

Обратите внимание на опции:

  • noexec — запрещает выполнение файлов.
  • nosuid — игнорирует setuid/setgid биты.
  • nodev — не интерпретирует устройства.

Если нужно, перемонтируйте с нужными опциями (требует sudo и редактирования /etc/fstab для постоянного эффекта):

sudo mount -o remount,exec /dev/sdb1 /mnt/usb

⚠️ Изменение опций монтирования может повлиять на безопасность. Убедитесь, что это необходимо.

Профилактика

Чтобы избежать ошибки EACCES в будущем, следуйте этим практикам:

  • Настраивайте umask при создании файлов/директорий. Файл .bashrc или /etc/profile может содержать umask 022 (права 755 для директорий, 644 для файлов). Это предотвратит создание файлов с открытыми правами.
  • Используйте группы для совместного доступа. Создайте группу (sudo group共享 devteam), добавьте пользователей (sudo usermod -aG devteam alice), и установите права на группу (chmod g+rwx /shared/dir).
  • Назначайте права минимально необходимыми. Избегайте chmod 777. Вместо этого давайте права только конкретным пользователям или группам (например, chmod 750 для владельца и группы).
  • Для скриптов и бинарников устанавливайте execute бит только если это необходимо, и только для владельца или группы.
  • Регулярно аудитируйте права на критических файлах и директориях с помощью ls -l или find / -perm -4000 -type f (для setuid файлов).
  • При работе с SELinux/AppArmor используйте стандартные контексты (например, httpd_sys_content_t для веб-файлов). Не отключайте полностью, а настраивайте профили.
  • Для сетевых или внешних носителей проверяйте опции монтирования. Если нужно выполнять файлы с USB, монтируйте с exec.
  • Избегайте запуска ненужных процессов от root. Используйте sudo только когда требуется, и предпочитайте делегирование прав через группы.

Следование этим рекомендациям снизит риск возникновения ошибок доступа и улучшит безопасность системы.

Часто задаваемые вопросы

Что означает ошибка EACCES в Linux?
Как быстро исправить ошибку Permission denied?
Можно ли предотвратить появление ошибки EACCES?
Почему ошибка EACCES возникает даже у пользователя root?

Полезное

Определите проблемный файл или команду
Проверьте текущие права доступа
Измените права с помощью chmod
Смените владельца, если необходимо
Используйте sudo для системных операций