Ошибка Permission denied в OpenWrt: причины и решения

Команда ./script.sh в терминале OpenWrt возвращает -ash: ./script.sh: Permission denied, хотя файл точно существует и путь указан верно — это классический симптом отсутствия бита исполнения, а не «сломанной» системы. Та же строка Permission denied появляется при подключении по SSH, при попытке записи в файл и при обращении к USB-накопителю, но в каждом случае причина своя.

В этой статье разберём, почему OpenWrt отказывает в доступе, как отличить проблему прав файла от проблемы аутентификации, и какие команды помогут локализовать источник ошибки. Материал ориентирован на стандартную прошивку OpenWrt с оболочкой ash (BusyBox), но общие принципы применимы к любой Linux-системе на роутере.

Что означает ошибка Permission denied в OpenWrt

Сообщение Permission denied («отказано в доступе») ядро Linux возвращает, когда процесс пытается выполнить действие, на которое у него нет полномочий: прочитать чужой файл, записать в защищённый каталог или запустить файл без флага исполнения. В OpenWrt чаще всего работа идёт под пользователем root, поэтому ошибка обычно указывает не на «чужой» файл, а на отсутствие атрибута исполнения, файловую систему, смонтированную только для чтения, или ограничения на уровне монтирования.

Важно различать три типовые ситуации. Первая — отказ при запуске скрипта или бинарника. Вторая — отказ при входе по SSH (здесь Permission denied выдаёт уже сервер dropbear, и речь об аутентификации). Третья — отказ при записи или удалении файла. Диагностика для каждого случая разная, поэтому первый шаг — точно понять, в какой момент появляется сообщение.

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

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

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

whoami

mount | grep " / "

df -h

Вывод ls -l покажет владельца и права в формате вида -rw-r--r--. Если в строке нет буквы x — файл не исполняемый, и попытка запуска через ./файл закономерно даст отказ. Команда mount покажет, не смонтирован ли раздел с флагом ro (read-only) или noexec, а df -h — не переполнен ли раздел, что иногда приводит к сбоям записи.

  • 🔍 ls -l — владелец и права доступа к файлу или каталогу
  • 👤 whoami — под каким пользователем вы работаете сейчас
  • 💾 mount — режим монтирования разделов (ro, noexec)
  • 📊 df -h — свободное место на разделах
  • 🧩 file /путь/к/бинарнику — подходит ли архитектура исполняемого файла

Ошибка при запуске скрипта или программы

Самая частая причина — у файла нет бита исполнения. Это происходит, когда скрипт скопирован через SCP/WinSCP с Windows-машины, распакован из архива или создан текстовым редактором. Исправляется одной командой:

chmod +x /путь/к/скрипту.sh

Вторая по распространённости причина — раздел смонтирован с опцией noexec. На OpenWrt это типично для съёмных носителей: даже с выставленным chmod +x запуск с такого раздела будет отклонён. Проверить можно командой mount | grep /mnt. Решение — перемонтировать без noexec или перенести исполняемый файл в системный раздел, например в /root или /usr/bin.

Третий сценарий — бинарник собран под другую архитектуру или другую стандартную библиотеку. OpenWrt использует musl вместо glibc, поэтому программа, собранная под обычный десктопный Linux, на роутере может не запуститься. Правда, в этом случае чаще встречается ошибка not found, но на части сборок проявляется и отказ в доступе. Проверяйте, что пакет установлен через opkg именно для вашей версии прошивки.

📊 В какой ситуации у вас возникла ошибка Permission denied?
При запуске скрипта или программы
При входе по SSH
При записи файла или установке пакета
При обращении к USB-накопителю

Permission denied при подключении по SSH

Когда ssh root@192.168.1.1 отвечает Permission denied, please try again или Permission denied (publickey), проблема в аутентификации, а не в правах файловой системы. Здесь есть несколько типовых вариантов.

Во-первых, неверный пароль — в том числе из-за раскладки клавиатуры или пароля, который ещё не был задан. В свежей прошивке до установки пароля SSH-доступ может быть ограничен: сначала зайдите через веб-интерфейс LuCI и задайте пароль root. Во-вторых, если настроен вход по ключу, сервер dropbear ищет публичный ключ в файле /etc/dropbear/authorized_keys. Отсутствие ключа в этом файле или неверные права на него приводят к отказу publickey.

# На роутере проверьте наличие и права файла ключей

ls -l /etc/dropbear/authorized_keys

При необходимости выставьте права

chmod 600 /etc/dropbear/authorized_keys

Ещё одна возможная причина — в настройках dropbear отключён вход по паролю (PasswordAuth) или по ключу, либо ограничен интерфейс, на котором слушает сервер. Эти параметры видны в LuCI в разделе настроек SSH или в файле /etc/config/dropbear. Сверяйте их с тем, как именно вы подключаетесь.

⚠️ Внимание: не отключайте проверку ключей и не открывайте SSH на WAN-интерфейсе «для проверки». Доступ к управлению роутером из внешней сети без необходимости — прямой риск компрометации устройства.

Отказ при записи файлов и установке пакетов

Если opkg install завершается ошибками записи, а редактор не может сохранить файл, проверьте три вещи: не переполнен ли раздел, не перешла ли файловая система в режим только для чтения из-за ошибок, и не пытаетесь ли вы писать в область, которая по задумке доступна только для чтения (например, части /rom).

OpenWrt использует оверлейную файловую систему: базовый образ в /rom неизменяем, а все изменения пишутся в overlay. Если раздел overlay заполнен, запись начнёт отказывать — очистка места через удаление ненужных пакетов и логов часто полностью снимает проблему. Посмотреть заполнение можно командой df -h /overlay.

При подозрении на ошибки файловой системы загляните в журнал ядра:

dmesg | tail -30

logread | tail -30

Строки про I/O error или перемонтирование в ro укажут на проблемы с флеш-памятью или накопителем. В таком случае сначала сохраните важные данные, а уже потом предпринимайте дальнейшие шаги.

☑️ Быстрая проверка при Permission denied

Выполнено: 0 / 5

Ошибки доступа к USB-накопителям и сетевым шарам

При подключении флешки или внешнего диска к OpenWrt отказ в доступе часто связан с типом файловой системы. Разделы NTFS и exFAT требуют отдельных пакетов (например, драйверов соответствующих ФС), а права на файлы в них не управляются стандартным chmod — поддержка POSIX-прав зависит от драйвера и опций монтирования. На FAT32 атрибутов исполнения нет в принципе, поэтому запуск скриптов с такого носителя невозможен без перемонтирования с особыми опциями.

Для сетевых ресурсов (NFS, SMB) добавляется ещё один слой: права проверяются и на стороне сервера. Если на роутере файл выглядит доступным, но запись отклоняется, проверяйте настройки шары и пользователя, под которым выполнено монтирование.

СитуацияВероятная причинаЧто проверить
Запуск скриптаНет бита исполненияls -l, затем chmod +x
Запуск с USBОпция noexec или FAT32mount, тип файловой системы
Вход по SSHПароль или ключ не принят/etc/dropbear/authorized_keys, настройки dropbear
Запись файлаРаздел ro или переполненdf -h, dmesg
Установка пакетаНет места в overlaydf -h /overlay

Чего делать не стоит

Распространённая ошибка — «лечить» любой отказ командой chmod 777 на всё подряд. Это не только не решает корневую причину (например, noexec она не снимет), но и открывает лишние права на системные файлы. Выставляйте права точечно и только после того, как поняли, какой именно атрибут мешает.

⚠️ Внимание: не меняйте права и владельца каталогов /etc, /rom, /lib рекурсивно. Некорректные права на системные файлы могут привести к тому, что роутер перестанет загружаться, и восстановление потребует failsafe-режима или перепрошивки.

Также не стоит сразу перепрошивать устройство при первой ошибке доступа. В подавляющем большинстве случаев проблема решается диагностикой за несколько минут, а перепрошивка — крайняя мера при повреждении файловой системы.

Когда стандартные методы не помогают

Если права корректны, место есть, файловая система в порядке, а отказ сохраняется, остаются менее частые причины: повреждённый файл (перекачайте или переустановите пакет), несовместимость бинарника с версией прошивки, сбой флеш-памяти. Для пакетов помогает переустановка через opkg install --force-reinstall имя_пакета.

При подозрении на аппаратные проблемы с флеш-памятью ориентируйтесь на записи в dmesg и поведение устройства: повторяющиеся ошибки ввода-вывода — повод сделать резервную копию конфигурации (sysupgrade -b) и готовиться к замене устройства или перепрошивке. Точные процедуры восстановления зависят от модели роутера, поэтому сверяйтесь с официальной документацией OpenWrt для вашего устройства.

Как сохранить конфигурацию перед серьёзными действиями

Выполните команду sysupgrade -b /tmp/backup.tar.gz и скопируйте получившийся архив на компьютер через SCP. В нём содержатся все настройки из /etc/config, и после перепрошивки конфигурацию можно будет восстановить.

Частые вопросы

Почему chmod +x не помогает запустить скрипт?

Скорее всего, раздел смонтирован с опцией noexec — это типично для USB-накопителей. Проверьте вывод mount и либо перемонтируйте раздел без этой опции, либо перенесите скрипт в системный раздел, например в /root.

SSH пишет Permission denied (publickey), хотя ключ добавлен. Что не так?

Проверьте, что публичный ключ находится именно в /etc/dropbear/authorized_keys (а не в ~/.ssh/, как в OpenSSH), и что права на файл — 600. Также убедитесь, что в настройках dropbear не отключён вход по ключу.

Можно ли исправить Permission denied, выставив chmod 777?

Технически иногда это снимает симптом, но делать так не стоит: чрезмерные права создают риски безопасности и не устраняют реальную причину (например, noexec или переполнение раздела). Используйте минимально необходимые права.

Ошибка появляется при установке пакетов через opkg. В чём дело?

Чаще всего переполнен раздел overlay — проверьте df -h /overlay и удалите ненужные пакеты или логи. Реже причина в ошибках файловой системы, которые видны в dmesg.

Скрипт запускается через sh, но не запускается через ./ — это нормально?

Да. Вызов через sh script.sh не требует бита исполнения, а прямой запуск ./script.sh — требует. Если chmod +x выставлен, но запуск всё равно отклонён, проверьте опцию noexec на разделе.