feat: autostart as a service + separate password setup (set-password.bat)
- set-password.bat: one-time password setup -> writes webvnc.conf (HASH + VNC_PASSWORD), syncs UltraVNC via ensure-vnc-password.ps1; if the 'web-vnc' task is installed, restarts it (elevated) to reload the new password, skipping restart when the password is unchanged. - run.bat: no longer prompts for the password; reads it from webvnc.conf (asks to run set-password.bat first if absent). Also clears --spawn-command (not just --spawn) when 5900 is already listening, to avoid spawning a 2nd VNC server. - scripts/autostart-run.bat: non-interactive launcher for the scheduled task (reads webvnc.conf, finds only a LOCAL VNC server, never downloads at boot). - scripts/install-autostart.bat / uninstall-autostart.bat: register/remove a 'web-vnc' scheduled task (ONSTART, SYSTEM, HIGHEST) via schtasks. - scripts/restart-autostart.bat: restart the task to apply a new password; checks whether web-vnc.exe is running (stop+start, or just start). - .gitignore: ignore webvnc.conf (secret). - AGENTS.md / README.md: document the autostart flow, set-password.bat, the new scripts, and that the running gateway must be restarted to apply a password change.
This commit is contained in:
@@ -63,22 +63,30 @@ scripts/get-novnc.{ps1,sh} скачать noVNC
|
||||
scripts/get-vnc.ps1 скачать портативный UltraVNC в vnc/ (с верификацией zip)
|
||||
scripts/list-ips.ps1 список IPv4 машины (используется run.bat)
|
||||
scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (от админа)
|
||||
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с паролем из run.bat (пишет только при несовпадении; UAC только при смене) — вызывается из run.bat
|
||||
run.bat запуск в один клик (спрашивает только пароль); синхронизирует VNC-пароль UltraVNC с введённым (см. ensure-vnc-password.ps1); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
|
||||
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat
|
||||
set-password.bat настройка пароля: спрашивает пароль, синхронизирует VNC-пароль UltraVNC (ensure-vnc-password.ps1), генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored). Если установлено задание «web-vnc» — перезапускает его через scripts/restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс).
|
||||
webvnc.conf создаётся set-password.bat; содержит HASH=<pbkdf2-хэш> и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore).
|
||||
run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
|
||||
scripts/autostart-run.bat НЕинтерактивный launcher для автостарта (нет пауз/запросов): читает webvnc.conf, ищет только ЛОКАЛЬНЫЙ VNC-сервер (ничего не качает), запускает web-vnc.exe в foreground. Вызывается плановым заданием из install-autostart.bat.
|
||||
scripts/install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONSTART /RU SYSTEM /RL HIGHEST), запускающее scripts/autostart-run.bat при загрузке ОС; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf.
|
||||
scripts/uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа).
|
||||
scripts/restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную.
|
||||
```
|
||||
|
||||
## Соглашения и подводные камни
|
||||
|
||||
- **Кодировка файлов `.bat`:** **UTF-8 с BOM**, окончания строк **CRLF**, и `chcp 65001 >nul`
|
||||
после `@echo off`. Именно **BOM** заставляет `cmd` читать .bat как UTF-8 независимо
|
||||
от OEM-кодировки консоли (без BOM + `chcp 65001` в `cmd` даёт `????` — cmd читает
|
||||
файл по OEM-кодировке, а не по `chcp`). BOM + `chcp 65001` проверено: кириллица в
|
||||
`echo`/`set /p`/`for /f` отображается корректно, `@echo off` работает. Альтернатива
|
||||
без BOM — включить системную опцию «Beta: Use Unicode UTF-8 for worldwide language
|
||||
support» (тогда OEM-кодировка = 65001), но это влияет на всю систему (нужен reboot,
|
||||
могут ломаться legacy-приложения под cp866/cp1251) — поэтому по умолчанию BOM.
|
||||
Пиши через `[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($true))`.
|
||||
- **Go-файлы:** UTF-8 **без BOM**, LF. То же самое правило — не использовать
|
||||
- **Кодировка файлов `.bat`:** текст всех `.bat` — **English ASCII**, окончания строк **CRLF**,
|
||||
**без BOM** и без `chcp` — ASCII читается `cmd` одинаково при любой OEM-кодировке, так
|
||||
что кириллица в `echo`/`set /p`/`for /f` больше не нужна. Это намеренный отход от
|
||||
кириллицы в bat-файлах (см. коммит «Translate run.bat and open-firewall.bat to English
|
||||
ASCII»). Исторически кириллица в `.bat` требовала **UTF-8 с BOM** + `chcp 65001 >nul`
|
||||
после `@echo off` (BOM заставлял `cmd` читать файл как UTF-8; без BOM + `chcp 65001` в
|
||||
`cmd` давал `????`, т.к. cmd читает файл по OEM-кодировке, а не по `chcp`). Альтернатива
|
||||
без BOM — системная опция «Beta: Use Unicode UTF-8 for worldwide language support»
|
||||
(OEM=65001), но она влияет на всю систему (reboot, могут ломаться legacy-приложения
|
||||
под cp866/cp1251). Если когда-нибудь вернёшь кириллицу в `.bat` — пиши через
|
||||
`[System.IO.File]::WriteAllText(path, content -replace "(?<!\r)\n","`r`n", [Text.UTF8Encoding]::new($true))`
|
||||
(с BOM). Для **English ASCII** — то же, но `[Text.UTF8Encoding]::new($false)` (без BOM).- **Go-файлы:** UTF-8 **без BOM**, LF. То же самое правило — не использовать
|
||||
`Set-Content -Encoding UTF8` (ставит BOM). Используй
|
||||
`[System.IO.File]::WriteAllText(path, content, [Text.UTF8Encoding]::new($false))`.
|
||||
- **`.gitignore`:** бинарники игнорируются **root-anchored** (`/web-vnc`,
|
||||
@@ -112,6 +120,41 @@ run.bat запуск в один клик (спрашивае
|
||||
- **Hijack WebSocket:** `internal/relay` сам делает апгрейд через
|
||||
`http.Hijacker`; гейтвей НЕ использует gorilla/websocket.
|
||||
|
||||
## Автостарт (запуск при загрузке ОС)
|
||||
|
||||
Чтобы gateway поднимался сам при включении машины (а не интерактивно через `run.bat`),
|
||||
пароль должен быть настроен заранее и не запрашиваться при старте. Поэтому процедура:
|
||||
|
||||
1. **Один раз** запустить `set-password.bat` — он спрашивает пароль, синхронизирует
|
||||
VNC-пароль UltraVNC (`scripts/ensure-vnc-password.ps1`), генерирует хэш и пишет
|
||||
`webvnc.conf` (HASH + VNC_PASSWORD). Файл `webvnc.conf` — **секрет**, в git не
|
||||
коммитится (см. `.gitignore`).
|
||||
2. **Один раз (от админа)** запустить `scripts/install-autostart.bat` — регистрирует
|
||||
плановое задание `web-vnc` через `schtasks /Create /SC ONSTART /RU SYSTEM /RL HIGHEST`,
|
||||
которое при загрузке ОС запускает `scripts/autostart-run.bat`.
|
||||
3. `scripts/autostart-run.bat` — **неинтерактивный** launcher: читает `webvnc.conf`,
|
||||
при необходимости собирает `web-vnc.exe` (если есть Go), ищет только **локальный**
|
||||
VNC-сервер (ничего не качает — на старте сети/интернета может не быть), и запускает
|
||||
`web-vnc.exe --password-hash <HASH> --listen :8080` в foreground (задание держит
|
||||
процесс живым). Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) — запускает
|
||||
**без** `--spawn` и **без** `--spawn-command`, подключаясь к существующему серверу
|
||||
(иначе попытка породить второй VNC-сервер конфликтовала бы с сервисом).
|
||||
4. Снять автостарт: `scripts/uninstall-autostart.bat` (от админа) — `schtasks /Delete`.
|
||||
|
||||
Замечания:
|
||||
- Задание выполняется от `SYSTEM`, поэтому VNC-сервер, отдавающий рабочий стол, должен
|
||||
быть отдельным сервисом (UltraVNC `uvnc_service`) — `autostart-run.bat` его НЕ порождает,
|
||||
а лишь подключается к `127.0.0.1:5900`. Портативный `vnc\winvnc.exe` используется только
|
||||
если 5900 ещё не слушает.
|
||||
- **Смена пароля на ходу:** `web-vnc.exe` читает хэш и `WEBVNC_VNC_PASSWORD` **один раз
|
||||
при старте** (`config.Parse`/`auth.New`) и никогда не перечитывает `webvnc.conf`. Поэтому
|
||||
`set-password.bat` после перезаписи `webvnc.conf` сам перезапускает задание «web-vnc» через
|
||||
`scripts\restart-autostart.bat` (elevation): тот проверяет `tasklist`, запущен ли
|
||||
`web-vnc.exe`, и делает `schtasks /End` + `/Run` (или только `/Run`, если процесс не
|
||||
запущен). Рестарт пропускается, если пароль не изменился (детект по старому `VNC_PASSWORD`
|
||||
из `webvnc.conf`, т.к. PBKDF2-хэш всегда новый из-за соли). Если задание не установлено —
|
||||
`set-password.bat` только пишет `webvnc.conf` и подсказывает `install-autostart.bat`. Для
|
||||
интерактивного `run.bat` нового пароля — просто перезапусти его вручную.
|
||||
## Что делать дальше (известные TODO)
|
||||
|
||||
- Надёжный авто-скачиватель VNC-сервера (URL UltraVNC на SourceForge нестабилен —
|
||||
@@ -122,6 +165,6 @@ run.bat запуск в один клик (спрашивае
|
||||
**UltraVNC как сервис (`uvnc_service`, LocalSystem):** пароль хранится в
|
||||
`%ProgramData%\UltraVNC\ultravnc.ini`; задать его обычным пользователем через
|
||||
tray-иконку молча не получается (нет прав на запись).
|
||||
`run.bat` синхронизирует этот пароль сам через `scripts/ensure-vnc-password.ps1`
|
||||
`set-password.bat` синхронизирует этот пароль сам через `scripts/ensure-vnc-password.ps1`
|
||||
(пишет только при несовпадении; UAC только при смене пароля). VNC-пароль = первые 8 байт,
|
||||
поэтому используй ASCII-пароль <= 8 символов и там, и в `run.bat`.
|
||||
поэтому используй ASCII-пароль <= 8 символов и в `set-password.bat`, и в VNC-сервере.
|
||||
|
||||
Reference in New Issue
Block a user