Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья6 мин чтенияПросмотры2

Permission denied: как найти директорию без права поиска через namei

Практическая диагностика Permission denied в Linux: разложить путь через namei -l, найти промежуточную директорию без права поиска x и проверить точечное исправление без рекурсивного chmod.

Комментарии 0

Металлическое ограждение с замком между серверными стойками и инструментами диагностики
В этой статье

Если Linux отвечает Permission denied для известного файла, сначала разложите путь командой namei -l. Она показывает режим, владельца и группу каждого компонента. Первый каталог без права поиска x для процесса — основная точка проверки; права конечного файла могут быть исправны.

Не начинайте с chmod -R и тем более с 777. Такая команда меняет больше объектов, чем требует диагностика, и может скрыть исходную причину.

Что показывает namei -l

namei проходит путь по компонентам, следует по символическим ссылкам и показывает, на каком участке разбор остановился. Ключ -l включает длинный формат: тип, биты режима, владельца и группу.

Для каждого промежуточного каталога процессу нужно право поиска. Если его нет, ядро возвращает EACCES — Permission denied. У каталога это право обозначается битом x; оно отличается от чтения списка имён по биту r. Это поведение описано в руководстве по разрешению путей Linux.

Фрагмент вывода

Что видно

Первая гипотеза

d--------- locked

У каталога нет r, w и x

Путь остановится для процесса без обходных capability

app - Permission denied

Следующий компонент не прочитан

Проверять права директории с именем locked

-rw-r--r-- config.ini

Конечный файл виден

Промежуточные каталоги уже пройдены

Входные условия и границы

  • Команды выполняются от имени того же пользователя или процесса, который получает ошибку.

  • Нужен полный абсолютный путь, а не только имя конечного файла.

  • Учебный тест выполнен в отдельном каталоге /tmp; рабочие файлы и службы не изменялись.

  • Проверка не заменяет отдельный разбор ACL, SELinux, AppArmor, NFS и контейнерных отображений.

Среда повторной проверки 13 октября 2026 года: Ubuntu 24.04.3 LTS, Linux 6.18.44, util-linux 2.39.3. Текущий процесс не имел capability для обхода обычных проверок DAC.

Минимальная диагностика

Подставьте фактический абсолютный путь проблемного файла:

namei -l /var/www/example/bitrix/.settings.php

Читайте результат сверху вниз. Если вывод остановился на каталоге, причина находится до конечного файла. Проверка только через ls -l конечного файла здесь не помогает: до него процесс ещё не дошёл.

Пример характерного фрагмента:

drwxr-xr-x root root mikhail-namei-lab-20261012 d--------- root root locked app - Permission denied

Первый подозрительный компонент — locked. Строка app - Permission denied показывает место остановки, но менять права на app вслепую рано: директория app ещё не разрешена как компонент пути.

Компоненты пути до каталога locked, где прекращается разрешение из-за EACCES
Учебный путь: namei -l останавливается на locked без search-права.

Воспроизводимый тест

В изолированной модели создаётся файл config.ini внутри каталога locked. Все родительские каталоги имеют обычные права, затем locked получает режим 0000.

lab_dir=/tmp/mikhail-namei-lab-20261012 locked_dir="$lab_dir/locked" app_dir="$locked_dir/app" config_file="$app_dir/config.ini" install -d -m 0755 "$lab_dir" "$locked_dir" "$app_dir" printf 'mode=training\n' >"$config_file" chmod 0644 "$config_file" chmod 0000 "$locked_dir"

После этого namei -l доходит до locked, но не может разрешить app. Проверка чтения возвращает код 1:

namei -l "$config_file" test -r "$config_file" printf 'read_check=%s\n' "$?"

d--------- root root locked app - Permission denied read_check=1

Для учебной директории владелец сохраняет rwx, а группе и остальным разрешаем только проход по x:

chmod 0711 "$locked_dir"

Повтор показывает полный путь, а проверка чтения возвращает 0:

drwx--x--x root root locked drwxr-xr-x root root app -rw-r--r-- root root config.ini read_check=0

Режим locked

Наблюдение namei

Проверка чтения

Вывод

0000

Остановка перед app

1

Для директории отсутствует search-право (бит x)

0711

Путь показан полностью

0

Компонент можно пройти; файл читается

Сравнение режимов каталога 0000 и 0711 в учебном тесте
При 0000 путь не разрешён и read_check=1; при 0711 тот же процесс получает полный путь и read_check=0.

Оба сценария выполнены дважды; итоговый скрипт завершился с кодом 0. Значение 0711 выбрано только для учебной модели и не является готовой рекомендацией для рабочего сервера.

Порядок на рабочем сервере

  1. Зафиксируйте пользователя процесса, полный путь и точное сообщение ошибки.

  2. Запустите namei -l от имени затронутого пользователя или в эквивалентном контексте.

  3. Найдите первый компонент, после которого появляется Permission denied.

  4. Сверьте ожидаемых владельца, группу и модель доступа именно для этого каталога.

  5. Проверьте ACL и политики безопасности, если обычные биты режима выглядят корректно.

  6. Меняйте только подтверждённый объект по согласованной политике доступа.

  7. Повторите namei -l и исходную операцию; сохраните оба результата.

Остановитесь до изменения, если неизвестно, какой пользователь должен иметь доступ, эта директория используется несколькими сервисами или права управляются конфигурацией развёртывания. Ручная правка тогда может исчезнуть при следующем обновлении.

Почему проверка от root может ввести в заблуждение

Root или процесс с CAP_DAC_OVERRIDE либо CAP_DAC_READ_SEARCH способен обходить часть обычных проверок доступа. Поэтому успешный namei или cat от root не доказывает, что путь доступен пользователю PHP-FPM, резервного копирования или фонового задания.

Что namei не доказывает

  • namei не подтверждает доступ для другого пользователя или контейнера с иными UID, GID и mount namespace.

  • namei не подтверждает, что ACL разрешает доступ; ограничения ACL проверяют отдельно.

  • namei не показывает итоговое решение SELinux или AppArmor; контекст и профиль проверяют отдельно.

  • namei не подтверждает доступность сетевой файловой системы и правильность её правил сопоставления пользователей.

  • namei не подтверждает правильность содержимого и владельца конечного файла после успешного прохода пути.

Как подтвердить исправление

Результат принят, если namei -l показывает весь путь в нужном контексте, исходная операция завершается успешно, а изменение ограничено подтверждённым компонентом. По одному запуску от root выводить рано: повторите проверку тем же пользователем, который ранее получал Permission denied.

В учебном тесте критерий выполнен: при 0000 путь остановился и read_check был 1; при 0711 namei показал весь путь и read_check стал 0. Это подтверждает влияние права поиска x на промежуточную директорию, но не переносит выбранный режим на рабочий сервер.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.