Написання shell-скриптів в OpenWrt
Стандартний shell в OpenWrt — ash (Almquist Shell)
Стандартний інтерпретатор команд у OpenWrt — це Almquist shell, більш відомий як ash. Це також стандартний shell, що постачається у складі BusyBox. У більшості дистрибутивів Linux, таких як Ubuntu чи Debian, використовується bash, який є набагато більшим і складнішим за ash. Наприклад, bash займає приблизно 1 МБ на диску — що є надмірним для вбудованих пристроїв.
Натомість BusyBox займає менше 512 КБ і окрім shell'а ash містить багато інших корисних утиліт. Наприклад: awk, grep, sed та vi/vim. Зверніть увагу, що навіть заводські прошивки багатьох роутерів використовують BusyBox із тих же міркувань — економія пам’яті та простору.
OpenWrt, BusyBox і shell ash
Прошивка OpenWrt використовує BusyBox через його надзвичайну ефективність — як за об’ємом у RAM, так і за кількістю функцій. Але пам’ятайте, що деякі утиліти BusyBox можуть бути обмеженими порівняно з їхніми «повноцінними» аналогами на ПК.
Втім, bash і ash досить подібні для більшості базових сценаріїв. Якщо ваш скрипт використовує лише POSIX-сумісні конструкції, він має працювати й у ash.
Питання: Чи можу я встановити повноцінний Bash або інші Linux CLI-інструменти, включаючи мій улюблений редактор?
Відповідь: Так! (але є нюанси)
Якщо ваш роутер підтримує USB-накопичувачі і ви налаштуєте зовнішній диск, ви отримаєте більше місця для встановлення програм. Після цього ви зможете легко встановити пакет bash.
OpenWrt також має пакети повноцінних coreutils: basename, cat, rm, sort, sleep тощо.
Список усіх CLI-пакетів: категорія Utilities (пошукайте за `coreutils`).
Серед редакторів доступні: nano, vim, vim-full, vim-fuller
УВАГА: НЕ встановлюйте vim-пакети, якщо ви не маєте USB-накопичувача!
Наприклад, `vim-fuller` займає ~2.8 МБ — і ще більше після встановлення.
Shebang та shell-скрипти в OpenWrt
Скрипти в OpenWrt повинні починатися з рядка:
#!/bin/sh
Використання `#!/bin/bash` не працюватиме. Детальніше: оператор shebang
Чи можна змінити стандартний shell з ash на bash?
Коротка відповідь — можна, але не рекомендується.
⚠️ Попередження: Якщо ви зміните `/etc/passwd`, щоб встановити для root shell, відмінний від `/bin/sh`, ви майже напевно втратите доступ по SSH до пристрою!
Якщо bash встановлено, ви можете вручну запускати `bash` після входу в систему, не змінюючи стандартний shell. Це набагато безпечніше.
У разі проблем із доступом по SSH — див. режим відновлення (failsafe).
Автоматична перевірка shell-скриптів
Напишіть свій скрипт із заголовком `#!/bin/sh` та перевірте його на https://www.shellcheck.net/ Цей сервіс підкаже, які функції не сумісні з OpenWrt/ash. Деталі: https://github.com/koalaman/shellcheck/blob/master/README.md#portability
Перевірка наявності утиліти
Установки OpenWrt — мінімальні, тому деякі команди можуть бути недоступні.
Перевірте наявність інструмента командою:
type назва_команди
Приклад:
# type time time is /usr/bin/time
Список усіх доступних утиліт шукайте в розділі Packages → Utilities.
Див. також: Конфігурація в скриптах