Что означает ошибка отсутствия прав на выполнение
При попытке запустить файл из терминала система возвращает сообщение bash: ./имя_файла: Permission denied или код завершения 126. Ядро Linux блокирует исполнение, если файл не помечен как исполняемый или размещён на носителе, где запуск программ запрещён политикой безопасности. Это базовый механизм защиты, предотвращающий случайное выполнение вредоносных скриптов или повреждённых бинарных файлов.
Причины возникновения
- Отсутствует бит выполнения (
x) в POSIX-правах файла. - Файл скопирован из Windows или загружен через браузер без сохранения атрибутов.
- Раздел диска смонтирован с опцией
noexec(часто применяется на/tmp, внешних USB-накопителях или сетевых шарах). - Модули безопасности SELinux или AppArmor блокируют запуск из определённых директорий.
- Архитектура файла не совпадает с системой (например, попытка запустить ARM-бинарник на x86_64).
Способы решения
Способ 1: Выдача прав через chmod
Самый быстрый и безопасный метод — добавить бит выполнения для владельца, группы или всех пользователей.
- Откройте терминал и перейдите в папку с файлом:
cd /путь/к/директории - Проверьте текущие атрибуты:
ls -l имя_файла - Если в первой строке вывода нет символа
x, примените команду:chmod +x имя_файла - Для системных скриптов или утилит, доступных всем пользователям, используйте строгие права:
sudo chmod 755 имя_файла
💡 Совет: После изменения прав запустите файл через
./имя_файла. Убедитесь, что в первой строке скрипта указан корректный shebang (например,#!/bin/bashили#!/usr/bin/env python3).
Способ 2: Прямой вызов через интерпретатор
Если вы работаете с текстовым скриптом и не хотите менять файловые атрибуты, вызовите оболочку напрямую.
bash ./скрипт.sh
python3 ./скрипт.py
Этот метод игнорирует проверку флага выполнения, так как интерпретатор читает файл как обычные данные, а система запускает саму программу-оболочку.
Способ 3: Перемонтирование раздела с опцией exec
Если chmod не даёт результата, вероятно, файловая система смонтирована с запретом на выполнение программ.
- Проверьте текущие параметры монтирования:
mount | grep $(df --output=source /путь/к/файлу | tail -n 1) | grep -o 'noexec' - Если вывод возвращает
noexec, временно разрешите запуск:sudo mount -o remount,exec /точка/монтирования
⚠️ Важно: Опция
noexecчасто используется для защиты от вирусов. Включайтеexecтолько на доверенных носителях и возвращайте оригинальные параметры после завершения работы.
Способ 4: Диагностика модулей безопасности
На серверных дистрибутивах политики безопасности могут блокировать запуск даже при корректных правах доступа.
- Для RHEL/CentOS/Fedora: проверьте логи
auditи временно переведите SELinux в режим предупреждений:sudo setenforce 0 - Для Ubuntu/Debian: проверьте статус AppArmor:
sudo aa-status | grep имя_файла
Если профиль блокирует файл, добавьте его в исключения или сгенерируйте локальную политику через aa-genprof ./имя_файла.
Профилактика
Чтобы ошибка не повторялась, соблюдайте простые правила при работе с файлами и скриптами:
- Настраивайте
umaskна уровне0022или0027в~/.bashrc, чтобы новые файлы не получали права на выполнение без вашего явного указания. - При копировании архивов или файлов между системами используйте
tarилиrsyncс флагом--permsдля строгого сохранения POSIX-атрибутов. - Размещайте пользовательские скрипты в директории
~/binили/usr/local/bin, которые по умолчанию поддерживают запуск и автоматически добавлены в переменную$PATH. - Проверяйте тип скачанных файлов командой
file ./программа, чтобы убедиться в совместимости архитектуры и отсутствии битых заголовков.