#Что означает ошибка
bash: ./script.sh: Permission denied
Чтобы запустить файл, система проверяет несколько вещей: есть ли у вас право исполнения (x) на файл, можно ли заходить в каталоги по пути, разрешено ли исполнение на самой файловой системе и не запрещает ли его политика безопасности. Нарушение любого условия даёт Permission denied.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
У файла нет бита исполненияФайл скопирован, скачан или создан без права x. | ls -l script.sh показывает права вида -rw-r--r-- без буквы x. | Добавьте право: chmod +x script.sh (шаг 2). |
Раздел смонтирован с параметром noexecИсполнение файлов на этом разделе запрещено: так часто монтируются флешки, внешние диски и /tmp. | Права на файл верные, но запуск запрещён; findmnt показывает noexec. | Скопируйте файл на раздел без noexec либо запускайте через интерпретатор (bash script.sh). |
Нет прав на каталог по путиНет права x на один из каталогов, ведущих к файлу. | namei -l показывает каталог без права прохода для вас. | Откройте право прохода (chmod o+x каталог) или запускайте от владельца. |
| Файл принадлежит другому пользователю или rootПрава исполнения есть только у владельца. | ls -l показывает другого владельца и права -rwx------. | Запустите от владельца, либо измените права/владельца осознанно. |
| SELinux или AppArmor запрещает запускПолитика безопасности блокирует исполнение из этого места. | Права в порядке, но запуск запрещён; в журналах audit есть записи denied. | Проверьте журналы безопасности и контекст файла; не отключайте защиту целиком. |
#Пошаговая диагностика
- Посмотрите права на файлОткройте терминал и выполните
namei -l /реальный/путь/к/файлу, затемls -ld /реальный/путь/к/файлус реальным путём. Для запуска скрипта нужна отметка исполнения на самом файле и разрешение прохода по каталогам. Не выставляйтеchmod 777и не меняйте права системных файлов из чужой инструкции. - Добавьте право исполненияВ терминале перейдите в каталог со скриптом и проверьте
ls -l ./script.sh. Если это ваш доверенный скрипт, а в правах отсутствует букваx, выполнитеchmod u+x ./script.sh, затем запустите./script.sh. Сначала откройте файл в редакторе и проверьте содержимое; не запускайте незнакомые сценарии только потому, что они требуют прав. Если ошибка осталась, проверьте путь, строку#!и параметры монтирования. - Проверьте, как смонтирован разделВведите
findmnt -T ./script.sh -o TARGET,FSTYPE,OPTIONSиз каталога скрипта. Если в OPTIONS указаноnoexec, запуск исполняемых файлов на этом разделе ограничен. Не перемонтируйте системные или корпоративные диски без разрешения. Для доверенного сценария оболочки временно используйтеbash ./script.sh, если он написан для Bash, либо перенесите скрипт на разрешённый файловый раздел. Если файл не является текстовым скриптом, запуск через Bash не поможет. - Проверьте права на каталоги по путиВ терминале выполните
id, затемls -ld -- ПУТЬдля реального файла или каталога (вместоПУТЬподставьте путь из ошибки, в кавычках при пробелах). Чтобы увидеть права всех промежуточных каталогов, выполнитеnamei -l -- ПУТЬ. По выводу определите, кому принадлежат файлы и есть ли право прохода (x) по каталогам. Не назначайте777и не меняйте владельца рекурсивно без понимания роли файлов. - Запустите через интерпретатор для проверкиКоманда
bash script.shвыполнит файл без праваx— это подтвердит, что проблема именно в праве исполнения илиnoexec. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Как проверить результат
- Скрипт запускается и выполняет свою работу.
ls -lпоказывает права-rwxr-xr-x(или другие с буквойxу владельца).
#Если не помогло
Если запуск происходит из каталога на флешке или сетевой папке, скопируйте файл в домашний каталог и повторите. Для systemd-служб и cron проверьте пользователя, от имени которого запускается задание, и его права. На системах с SELinux просмотрите sudo ausearch -m avc -ts recent — там видны запреты политики.