Files
keenetic_ssh-web/README.md
Андрей Бобырев 7c7a58b3a9 docs+install: одна команда с GitHub (bootstrap.sh)
Made-with: Cursor
2026-04-26 00:06:05 +03:00

198 lines
7.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# keenetic_ssh-web
Локальный веб-интерфейс на **Keenetic + Entware**: список **shell-команд** на роутере (как «RouterSync», но вместо URL — **команда**), **расписание**, ручной запуск **всех** или **одной**, просмотр **stdout/stderr**. Сервис слушает порт **2001** (по умолчанию).
Репозиторий: [github.com/andrey271192/keenetic_ssh-web](https://github.com/andrey271192/keenetic_ssh-web)
---
<a id="white-ip-wan"></a>
## Важно: доступ только с «белых» / доверенных IP
Панель выполняет **произвольные команды в shell на самом роутере**. Размещайте её **только в доверенной сети** и **ограничьте WAN-доступ**.
- В `.env` задайте **`ALLOWED_IPS`** — список IP, с которых разрешены запросы (через запятую). Пустое значение = фильтр выключен (**не рекомендуется** на WAN).
- Дополнительно закройте порт **2001** на межсетевом экране Keenetic для всего интернета, кроме нужных адресов (как в справке Keenetic для облачного доступа: без прямого SSH с облака; здесь — **не публикуйте панель в открытый интернет** без allowlist).
**Пароль** `WEB_PASSWORD` обязателен: без него приложение не авторизует клиентов.
---
## Возможности
| | |
|---|---|
| **ВКЛ** | Команда участвует в ручном «Выполнить всё» и в одиночном запуске. |
| **Распис.** | Плюс участие в фоне по **интервалу** (минуты; **0** = только ручной режим). |
| **Вывод** | Кнопка «Вывод» раскрывает полный текст последнего запуска (stdout + stderr). |
| **Полоска автора** | GitHub, Boosty, Ozon (СБП), Telegram — внизу страницы (username из `.env`). |
Команды выполняются **на том же хосте**, где запущен Python (ваш Keenetic), с дополнением `PATH` для **Entware** (`/opt/bin` и т.д.).
---
## Требования
- Keenetic с **Entware**
- `python3`, желательно пакет **`python3-venv`** (`opkg install python3-venv`)
- Свободный порт **2001** (или другой в `.env`)
---
## Установка
### Одной командой с GitHub (на роутере, Entware)
Нужны **`curl`** или **`wget`** и **`tar`** (обычно уже есть). Скрипт скачает архив ветки **`main`**, распакует во временный каталог и выполнит **`install.sh`** (копирование в `/opt/share/keenetic_ssh-web`, venv, init).
```sh
curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/bootstrap.sh | sh
```
Другая ветка или форк:
```sh
export KSSH_BRANCH=main
export KSSH_REPO=andrey271192/keenetic_ssh-web
curl -fsSL "https://raw.githubusercontent.com/${KSSH_REPO}/${KSSH_BRANCH}/bootstrap.sh" | sh
```
После установки задайте пароль и (по желанию) список IP:
```sh
nano /opt/share/keenetic_ssh-web/.env
/opt/etc/init.d/S99keenetic-ssh-web start
```
### Установка из уже скачанного каталога
Скопируйте репозиторий на роутер или клонируйте через `git`, затем:
```sh
cd /path/to/keenetic_ssh-web
chmod +x install.sh uninstall.sh run.sh
./install.sh
```
Скрипт:
- копирует файлы в **`/opt/share/keenetic_ssh-web`**
- создаёт **`venv`**, ставит **Flask** и **Waitress**
- создаёт **`data/store.json`** и **`.env`** из примеров
- ставит **`/opt/etc/init.d/S99keenetic-ssh-web`**
Дальше:
```sh
nano /opt/share/keenetic_ssh-web/.env
# WEB_PASSWORD=...
# PORT=2001
# ALLOWED_IPS=192.168.1.100
# AUTHOR_TELEGRAM_USERNAME=Iot_andrey
/opt/etc/init.d/S99keenetic-ssh-web start
```
Откройте в браузере: `http://IP_РОУТЕРА:2001`
**Автозапуск** (если у вашей сборки Entware есть `rc.d`):
```sh
ln -sf /opt/etc/init.d/S99keenetic-ssh-web /opt/etc/rc.d/S99keenetic-ssh-web
```
Лог: `/opt/var/log/keenetic-ssh-web.log`
---
## Ручной запуск (без init)
```sh
cd /opt/share/keenetic_ssh-web
chmod +x run.sh
./run.sh
```
Для разработки на ПК:
```sh
python3 -m venv venv && ./venv/bin/pip install -r requirements.txt
export WEB_PASSWORD=test
./venv/bin/python app.py
# или: ./venv/bin/python -m waitress --listen=127.0.0.1:2001 app:app
```
---
## Удаление
### С GitHub (скрипт самодостаточный)
```sh
curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/uninstall.sh | sh
```
Сохранить каталог с данными (`.env`, `data/`), убрав только сервис:
```sh
curl -fsSL https://raw.githubusercontent.com/andrey271192/keenetic_ssh-web/main/uninstall.sh | env KEEP_DATA=1 sh
```
### Из каталога репозитория
```sh
cd /path/to/keenetic_ssh-web
chmod +x uninstall.sh
./uninstall.sh
```
Сохранить данные (`data/`, `.env`), но убрать сервис:
```sh
KEEP_DATA=1 ./uninstall.sh
```
---
## Переменные `.env`
| Переменная | Описание |
|------------|----------|
| `WEB_PASSWORD` | Пароль входа (**обязательно** сменить). |
| `PORT` | Порт HTTP (по умолчанию **2001**). |
| `CMD_TIMEOUT` | Таймаут одной команды, сек (по умолчанию **300**). |
| `AUTHOR_TELEGRAM_USERNAME` | Username для ссылки t.me внизу страницы. |
| `ALLOWED_IPS` | Список разрешённых IP клиентов через запятую; пусто = без фильтра (осторожно). |
---
## Безопасность
- Это **не песочница**: любая команда — с правами пользователя, от которого запущен процесс (часто **root** на Entware). Не вставляйте непроверенный текст.
- Не выставляйте порт в интернет без **пароля + allowlist** или VPN.
- Резервная копия: файл **`/opt/share/keenetic_ssh-web/data/store.json`**.
---
## Поддержка проекта
- **Boosty:** [boosty.to/andrey27/donate](https://boosty.to/andrey27/donate)
- **Ozon Bank (СБП):** [ссылка на оплату](https://finance.ozon.ru/apps/sbp/ozonbankpay/019dc200-2a5d-7931-a619-782d285f6798)
- **Telegram:** [@Iot_andrey](https://t.me/Iot_andrey)
Кнопка **Sponsor** на GitHub ведёт на варианты из `.github/FUNDING.yml`.
---
## Связанные проекты
- [keenetic-unified](https://github.com/andrey271192/keenetic-unified) — мониторинг и управление с **VPS** по SSH (нужен «белый» IP на WAN для SSH).
- В **keenetic_ssh-web** всё выполняется **локально на роутере**; сценарий доступа другой, но ограничение **ALLOWED_IPS** + файрвол по-прежнему рекомендуется.
---
## Лицензия
MIT