Compare commits
6
Commits
71e2fef4d9
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
02fefa1e4e | ||
|
|
f315618bfc | ||
|
|
9b8ee94dd5 | ||
|
|
754f77a8d0 | ||
|
|
0779b4327c | ||
|
|
120d4e9498 |
@@ -32,3 +32,6 @@ internal/server/static/novnc-original.html
|
||||
|
||||
# Downloaded VNC server (installed via scripts/get-vnc.ps1)
|
||||
/vnc/
|
||||
|
||||
# Stored web access password + hash (created by set-password.bat)
|
||||
webvnc.conf
|
||||
|
||||
@@ -58,27 +58,39 @@ internal/auth PBKDF2-HMAC-SHA256, HMAC session-cookie, rate-limit
|
||||
internal/relay websocket.go — RFC6455 на stdlib; relay.go — WS<->TCP
|
||||
internal/vncspawner кросс-ОС поиск/запуск VNC-сервера (build-теги по ОС)
|
||||
internal/server HTTP-роуты, /api/status, middleware сессии, embed.FS
|
||||
internal/server/static встроенные ассеты (vnc.html + noVNC core/app/vendor)
|
||||
internal/server/static встроенные ассеты (vnc.html, favicon.ico + noVNC core/app/vendor)
|
||||
|
||||
Все пользовательские точки входа лежат в корне репозитория:
|
||||
set-password.bat настройка пароля: спрашивает пароль, генерирует хэш и пишет webvnc.conf (HASH= + VNC_PASSWORD=, gitignored) — ДО синхронизации UltraVNC, чтобы веб-пароль был настроен даже если синк упадёт или UAC отменят; затем синхронизирует VNC-пароль UltraVNC (scripts/ensure-vnc-password.ps1). Если установлено задание «web-vnc» — перезапускает его через restart-autostart.bat (с elevation), чтобы живый gateway перезалил пароль; рестарт пропускается, только если пароль не изменился (PBKDF2-хэш всегда новый из-за соли, поэтому изменение детектится сравнением введённого пароля со старым VNC_PASSWORD из webvnc.conf). Саму проверку «запущен ли web-vnc.exe» делает restart-autostart.bat (elevated, надёжно видит SYSTEM-процесс).
|
||||
run.bat интерактивный запуск в один клик: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (НЕ спрашивает — если файла нет, просит сначала запустить set-password.bat); если 5900 уже занят (сервис UltraVNC) — не порождает второй VNC-сервер, а подключается к существующему
|
||||
install-autostart.bat регистрирует плановое задание «web-vnc» (schtasks /SC ONLOGON /RL HIGHEST, от имени текущего пользователя) — открывает ВИДИМУЮ консоль с scripts/autostart-run.bat при входе пользователя в систему; запускать от админа (самопрос elevation); требует уже созданный webvnc.conf. (Вариант ONSTART/SYSTEM скрыт в session 0 и окна не показывает — поэтому не используется.)
|
||||
uninstall-autostart.bat удаляет плановое задание «web-vnc» (от админа).
|
||||
restart-autostart.bat перезапускает задание «web-vnc» (от админа, auto-elevate): проверяет tasklist, запущен ли web-vnc.exe — если да, делает schtasks /End + пауза 2 c + schtasks /Run; если нет — только schtasks /Run. Вызывается из set-password.bat, или вручную.
|
||||
open-firewall.bat открыть порт 8080 в Windows Firewall (от админа, один раз).
|
||||
webvnc.conf создаётся set-password.bat; содержит HASH=<pbkdf2-хэш> и VNC_PASSWORD=<тот же пароль для noVNC>; читается run.bat и scripts/autostart-run.bat; в git не коммитится (.gitignore).
|
||||
|
||||
Внутренние помощники (вызываются другими скриптами, не пользователем) — в scripts/:
|
||||
scripts/autostart-run.bat launcher для автостарта: лежит в scripts/, но работает относительно КОРНЯ репо (cd /d %~dp0.. — web-vnc.exe/webvnc.conf/vnc/go.mod там). Читает webvnc.conf, ПОЛЛИТ 127.0.0.1:5900 до ~30 c (UltraVNC-сервис может ещё подниматься) и только потом запускает web-vnc.exe — без --spawn если 5900 уже слушает, иначе спавнит локальный VNC-сервер (portable vnc\\winvnc.exe/tvnserver.exe или авто-детект). Ничего не качает на старте. Запускается ВИДИМОЙ консолью (задание из install-autostart.bat): окно остаётся, пока web-vnc serves; при фатальной ошибке/no binary/no conf — pause, чтобы окно не закрылось и было видно причину. Вызывается также restart-autostart.bat.
|
||||
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC с введённым (пишет только при несовпадении; UAC только при смене) — вызывается из set-password.bat.
|
||||
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-сервер, а подключается к существующему
|
||||
```
|
||||
|
||||
## Соглашения и подводные камни
|
||||
|
||||
- **Кодировка файлов `.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`,
|
||||
@@ -92,9 +104,72 @@ run.bat запуск в один клик (спрашивае
|
||||
`list-ips.ps1` имеет фолбэк на `ipconfig`). Запущенный web-vnc.exe из
|
||||
фонового job может остаться «зомби» (Stop-Process иногда access denied);
|
||||
используй разные порты для тестов и по возможности запускай killable-способом.
|
||||
- **favicon.ico:** браузер запрашивает `/favicon.ico` на каждой странице
|
||||
(включая форму логина). Роут `/favicon.ico` зарегистрирован **вне** session-
|
||||
middleware (чтобы без сессии не редиректил на /login и не давал 404) и отдаёт
|
||||
встроенный `internal/server/static/favicon.ico` (иконка-монитор, коммитится;
|
||||
не входит в скачиваемые noVNC-ассеты). На логине и vnc.html есть
|
||||
`<link rel="icon" href="/favicon.ico">`.
|
||||
- **Secure context (TLS) в noVNC:** noVNC (`core/rfb.js`, `app/ui.js`) печатает
|
||||
`Log.Error("noVNC requires a secure context (TLS). Expect crashes!")` при
|
||||
`!window.isSecureContext` — т.е. на plain-http по LAN-IP. Для обычной VNC-
|
||||
password-авторизации это **безобидно**: noVNC использует чистый-JS DES из
|
||||
`core/des.js` и НЕ нуждается в `crypto.subtle`. Чтобы не пугать пользователя
|
||||
красной ошибкой в консоли, обёртка `vnc.html` ДО импорта `core/rfb.js`
|
||||
оборачивает `console.error` фильтром, гасящим **только** эту строку (всё
|
||||
остальное проходит в оригинальный `console.error`). Файлы noVNC (core/, app/,
|
||||
…) НЕ правятся — они gitignored и перезаливаются `scripts/get-novnc.*`.
|
||||
Корректный способ сделать контекст действительно secure — HTTPS (self-signed),
|
||||
но это отдельная фича; пока — фильтр в vnc.html.
|
||||
- **Hijack WebSocket:** `internal/relay` сам делает апгрейд через
|
||||
`http.Hijacker`; гейтвей НЕ использует gorilla/websocket.
|
||||
|
||||
## Автостарт (запуск при загрузке ОС)
|
||||
|
||||
Чтобы gateway поднимался сам при включении машины (а не интерактивно через `run.bat`),
|
||||
пароль должен быть настроен заранее и не запрашиваться при старте. Поэтому процедура:
|
||||
|
||||
1. **Один раз** запустить `set-password.bat` — он спрашивает пароль, генерирует хэш
|
||||
и пишет `webvnc.conf` (HASH + VNC_PASSWORD), а уже ПОТОМ синхронизирует VNC-пароль
|
||||
UltraVNC (`scripts/ensure-vnc-password.ps1`) — так веб-пароль оказывается настроен,
|
||||
даже если синк упадёт или UAC отменят. Файл `webvnc.conf` — **секрет**, в git не
|
||||
коммитится (см. `.gitignore`).
|
||||
2. **Один раз (от админа)** запустить `install-autostart.bat` — регистрирует
|
||||
плановое задание `web-vnc` через `schtasks /Create /SC ONLOGON /RL HIGHEST` (от имени
|
||||
текущего пользователя, без `/RU SYSTEM`), которое при **входе пользователя в систему**
|
||||
открывает **видимую консоль** с `scripts/autostart-run.bat`. Запуск от SYSTEM/ONSTART
|
||||
намеренно не используется: он выполняется в session 0 и НЕ показывает окно на рабочем
|
||||
столе, поэтому увидеть ошибки запуска было бы невозможно.
|
||||
3. `scripts/autostart-run.bat` — **неинтерактивный** launcher: читает `webvnc.conf`,
|
||||
при необходимости собирает `web-vnc.exe` (если есть Go), затем **опрашивает
|
||||
`127.0.0.1:5900` до ~30 c** (один PowerShell-проект крутит цикл try/TcpClient +
|
||||
`Start-Sleep 1`; выходит сразу, как только порт принял соединение) — UltraVNC-сервис
|
||||
при загрузке может ещё подниматься. Если `5900` слушает — запускает
|
||||
`web-vnc.exe --password-hash <HASH> --listen :8080` **без** `--spawn` (подключается
|
||||
к существующему серверу, не плодя второй). Если за ~30 c не поднялось — спавнит
|
||||
локальный VNC-сервер (`--spawn-command "vnc\winvnc.exe -run"` если есть portable,
|
||||
иначе `--spawn` с авто-детектом) и запускает web-vnc. На старте ничего не качает.
|
||||
Задание держит процесс живым в foreground.
|
||||
4. Снять автостарт: `uninstall-autostart.bat` (от админа) — `schtasks /Delete`.
|
||||
|
||||
Замечания:
|
||||
- Задание выполняется от имени **текущего пользователя** при его входе (видимая консоль),
|
||||
а не от SYSTEM в session 0. Поэтому web-vnc может сам спавнить VNC-сервер в сеансе
|
||||
пользователя (что удобнее для захвата рабочего стола, чем SYSTEM). Если уже работает
|
||||
сервис UltraVNC (`uvnc_service`) и слушает 5900 — `autostart-run.bat` подключается к нему
|
||||
без `--spawn`. Портативный `vnc\winvnc.exe` спавнится только если 5900 не слушает.
|
||||
- Автостарт срабатывает при **входе пользователя**, а не до входа. Если нужен запуск до
|
||||
логина (без окна) — это отдельный скрытый вариант ONSTART/SYSTEM; текущий по умолчанию
|
||||
ориентирован на «видимую консоль после ребута/логина».
|
||||
- **Смена пароля на ходу:** `web-vnc.exe` читает хэш и `WEBVNC_VNC_PASSWORD` **один раз
|
||||
при старте** (`config.Parse`/`auth.New`) и никогда не перечитывает `webvnc.conf`. Поэтому
|
||||
`set-password.bat` после перезаписи `webvnc.conf` сам перезапускает задание «web-vnc» через
|
||||
`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 нестабилен —
|
||||
@@ -105,6 +180,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-сервере.
|
||||
|
||||
@@ -18,29 +18,57 @@ Go-модулей, собирается офлайн.
|
||||
└─ прозрачный релей WS↔TCP
|
||||
```
|
||||
|
||||
## Самый простой запуск (Windows) — одним батником
|
||||
## Самый простой запуск (Windows)
|
||||
|
||||
В папке проекта есть `run.bat`. Он делает всё сам и спрашивает **только пароль**:
|
||||
Запуск состоит из двух шагов: один раз задаётся пароль, затем `run.bat` поднимает
|
||||
gateway без запросов.
|
||||
|
||||
1. **Один раз** задайте пароль:
|
||||
```bat
|
||||
set-password.bat
|
||||
```
|
||||
Спросит пароль доступа, сгенерирует хэш и сохранит его вместе с паролем в
|
||||
`webvnc.conf` (секрет, в git не коммитится), а затем синхронизирует им пароль
|
||||
UltraVNC-сервиса (`scripts\ensure-vnc-password.ps1`, UAC только при смене).
|
||||
Веб-пароль оказывается настроен, даже если синк UltraVNC упадёт или UAC отменят.
|
||||
Используйте ASCII-пароль длиной до 8 символов (VNC-пароль = первые 8 байт).
|
||||
|
||||
2. **Запустите gateway**:
|
||||
```bat
|
||||
run.bat
|
||||
```
|
||||
|
||||
Что делает `run.bat`:
|
||||
1. Если `web-vnc.exe` отсутствует — собирает его (нужен установленный Go).
|
||||
Если Go нет — подсказывает, что сделать.
|
||||
2. Если noVNC-клиент ещё не встроен — пытается его скачать (нужен интернет).
|
||||
Без интернета продолжит работу, но в браузере будет страница-заглушка.
|
||||
3. Спрашивает пароль доступа.
|
||||
4. Генерирует из него хэш.
|
||||
5. Ищет VNC-сервер: если он не установлен — пытается скачать портативный
|
||||
UltraVNC (`scripts\get-vnc.ps1`) и запускать его.
|
||||
6. Выводит список всех адресов для подключения (`http://localhost:8080` и
|
||||
`http://<каждый IPv4 машины>:8080`) и запускает сервер с флагом `--spawn`.
|
||||
`run.bat` собирает `web-vnc.exe` (нужен Go, если бинарника нет), встраивает
|
||||
noVNC-клиент (качает при наличии интернета), находит/докачивает VNC-сервер,
|
||||
читает пароль из `webvnc.conf` (больше не спрашивает), печатает адреса
|
||||
(`http://localhost:8080` и `http://<каждый IPv4 машины>:8080`) и запускает
|
||||
сервер с флагом `--spawn`. Если `127.0.0.1:5900` уже слушает (сервис UltraVNC) —
|
||||
запускается без `--spawn`, подключаясь к существующему серверу.
|
||||
|
||||
После запуска откройте в браузере один из выведенных адресов,
|
||||
введите тот же пароль — и попадёте на рабочий стол.
|
||||
|
||||
### Автостарт при загрузке ОС (вместо ручного `run.bat`)
|
||||
|
||||
```bat
|
||||
set-password.bat :: один раз: пароль -> webvnc.conf
|
||||
install-autostart.bat :: один раз (от админа): плановое задание «web-vnc»
|
||||
```
|
||||
`install-autostart.bat` регистрирует через `schtasks` задание (`ONLOGON`, `HIGHEST`,
|
||||
от имени текущего пользователя), которое **при входе в систему открывает видимую
|
||||
консоль** с `scripts\autostart-run.bat` — launcher, читающий `webvnc.conf`, ждущий
|
||||
`127.0.0.1:5900` до ~30 c и затем запускающий `web-vnc.exe` (не качает ничего на старте).
|
||||
Окно остаётся, пока web-vnc работает; при ошибке — пауза, чтобы было видно причину.
|
||||
Запуск от `SYSTEM`/`ONSTART` не используется: он в session 0 и окна не показывает.
|
||||
Запустить сразу без перезагрузки: `schtasks /Run /TN "web-vnc"`.
|
||||
Снять автостарт: `uninstall-autostart.bat` (от админа).
|
||||
|
||||
**Смена пароля:** `web-vnc.exe` читает пароль из `webvnc.conf` только при старте и не
|
||||
перечитывает его в runtime. Поэтому `set-password.bat` (если задание «web-vnc» установлено)
|
||||
перезапускает его через `restart-autostart.bat` (с elevation) — тот проверяет,
|
||||
запущен ли `web-vnc.exe` (если да — стоп + старт, если нет — только старт). Рестарт
|
||||
пропускается, если пароль не изменился. Для интерактивного `run.bat` просто перезапустите
|
||||
его вручную.
|
||||
|
||||
## Быстрый старт вручную (Windows)
|
||||
|
||||
```powershell
|
||||
@@ -166,7 +194,7 @@ web-vnc --gen-hash "ваш-пароль"
|
||||
По умолчанию Windows Firewall блокирует входящие подключения. Один раз
|
||||
выполните от имени администратора:
|
||||
```bat
|
||||
scripts\open-firewall.bat
|
||||
open-firewall.bat
|
||||
```
|
||||
Это откроет входящий TCP-порт 8080. (`run.bat` выводит адреса и подсказку.)
|
||||
|
||||
@@ -182,11 +210,22 @@ internal/relay WebSocket на stdlib (RFC 6455) + мост WS↔TCP
|
||||
internal/vncspawner кросс-ОС поиск и запуск VNC-сервера
|
||||
internal/server HTTP-роуты, middleware сессии, встроенная статика
|
||||
internal/server/static встроенные веб-ассеты (vnc.html + core/app/vendor noVNC)
|
||||
|
||||
Пользовательские точки входа — в корне репозитория:
|
||||
run.bat интерактивный запуск: собирает бинарник/noVNC/VNC, читает пароль из webvnc.conf (не спрашивает)
|
||||
set-password.bat разовая настройка пароля -> webvnc.conf (хэш + VNC-пароль); синхронизирует UltraVNC
|
||||
install-autostart.bat автостарт при входе (schtasks ONLOGON/HIGHEST, видимая консоль) — от админа
|
||||
uninstall-autostart.bat снять автостарт — от админа
|
||||
restart-autostart.bat перезапустить задание «web-vnc» (чтобы применить новый пароль) — от админа
|
||||
open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа)
|
||||
webvnc.conf секрет: HASH= + VNC_PASSWORD= (создаётся set-password.bat, gitignored)
|
||||
|
||||
Внутренние помощники — в scripts/ (вызываются другими скриптами):
|
||||
scripts/autostart-run.bat launcher автостарта (видимая консоль): cd в корень репо, читает webvnc.conf, ждёт 5900 до ~30 c, запускает web-vnc (без --spawn, если VNC уже слушает); pause на ошибке
|
||||
scripts/ensure-vnc-password.ps1 синхронизирует VNC-пароль UltraVNC (вызывается из set-password.bat)
|
||||
scripts/get-novnc.{ps1,sh} скачать noVNC во встроенную статику
|
||||
scripts/get-vnc.ps1 скачать портативный VNC-сервер (UltraVNC) в папку vnc/
|
||||
scripts/list-ips.ps1 список IPv4 машины (используется run.bat)
|
||||
scripts/open-firewall.bat открыть порт 8080 в Windows Firewall (один раз, от админа)
|
||||
run.bat запуск в один клик (спрашивает только пароль)
|
||||
```
|
||||
|
||||
## Кросс-компиляция под другую ОС
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
@echo off
|
||||
REM ============================================================
|
||||
REM install-autostart.bat - register web-vnc as a startup task.
|
||||
REM Creates a scheduled task "web-vnc" that runs at YOUR logon
|
||||
REM (as the current user, with highest privileges available to
|
||||
REM you) and opens a VISIBLE console window running
|
||||
REM scripts\autostart-run.bat. The console stays open while
|
||||
REM web-vnc serves, and pauses on error so you can see why it
|
||||
REM did not start.
|
||||
REM
|
||||
REM Why logon (not boot/SYSTEM): a task that runs as SYSTEM at
|
||||
REM boot runs in session 0 and CANNOT show a window on your
|
||||
REM desktop, so you would never see its output. Running at your
|
||||
REM logon, in your session, makes the console visible. (If you
|
||||
REM need it before any user logs in, that requires the hidden
|
||||
REM SYSTEM/boot variant - which is invisible by design.)
|
||||
REM Requires administrator rights (auto-elevates).
|
||||
REM Run set-password.bat first to configure the password.
|
||||
REM ============================================================
|
||||
cd /d "%~dp0"
|
||||
|
||||
REM Admin check + auto-elevate.
|
||||
net session >nul 2>nul
|
||||
if errorlevel 1 (
|
||||
echo Requesting administrator rights ...
|
||||
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
|
||||
exit /b
|
||||
)
|
||||
|
||||
if not exist "webvnc.conf" (
|
||||
echo [error] Password is not configured. Run set-password.bat first.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
if not exist "scripts\autostart-run.bat" (
|
||||
echo [error] scripts\autostart-run.bat not found.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
set "TASK=web-vnc"
|
||||
set "CMD=%~dp0scripts\autostart-run.bat"
|
||||
|
||||
echo Creating scheduled task "%TASK%" (at logon, current user, highest, visible) ...
|
||||
schtasks /Create /TN "%TASK%" /TR "cmd /c \"%CMD%\"" /SC ONLOGON /RL HIGHEST /F
|
||||
if errorlevel 1 (
|
||||
echo [error] Could not create the task.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo Done. web-vnc will start automatically when you log in: a console
|
||||
echo window will open and stay while it serves. Close that window to stop it.
|
||||
echo Start it now (without re-logging-in):
|
||||
echo schtasks /Run /TN "%TASK%"
|
||||
echo Remove it with: uninstall-autostart.bat
|
||||
echo.
|
||||
pause
|
||||
@@ -58,6 +58,11 @@ func (s *Server) Handler() http.Handler {
|
||||
|
||||
mux.Handle(s.cfg.RelayPath, s.requireSession(http.HandlerFunc(s.handleRelay)))
|
||||
mux.Handle(s.cfg.NoVNCPath, s.requireSession(http.HandlerFunc(s.serveNoVNCPage)))
|
||||
|
||||
// favicon is fetched by the browser on every page (incl. the login form);
|
||||
// serve it without a session so it doesn't redirect to /login and 404.
|
||||
mux.HandleFunc("/favicon.ico", s.handleFavicon)
|
||||
|
||||
mux.Handle("/", s.requireSession(http.HandlerFunc(s.handleIndexOrStatic)))
|
||||
|
||||
return s.logRequest(mux)
|
||||
@@ -110,6 +115,19 @@ func (s *Server) handleRelay(w http.ResponseWriter, r *http.Request) {
|
||||
s.relay.ServeHTTP(w, r)
|
||||
}
|
||||
|
||||
// handleFavicon serves the embedded favicon.ico with a long cache. It is
|
||||
// registered outside requireSession so it loads on the login page too.
|
||||
func (s *Server) handleFavicon(w http.ResponseWriter, r *http.Request) {
|
||||
data, err := fs.ReadFile(s.static, "favicon.ico")
|
||||
if err != nil {
|
||||
http.NotFound(w, r)
|
||||
return
|
||||
}
|
||||
w.Header().Set("Content-Type", "image/x-icon")
|
||||
w.Header().Set("Cache-Control", "public, max-age=604800")
|
||||
_, _ = w.Write(data)
|
||||
}
|
||||
|
||||
func (s *Server) serveNoVNCPage(w http.ResponseWriter, r *http.Request) {
|
||||
if data, err := fs.ReadFile(s.static, "vnc.html"); err == nil {
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 446 B |
@@ -4,6 +4,7 @@
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Web VNC</title>
|
||||
<link rel="icon" href="/favicon.ico" type="image/x-icon">
|
||||
<style>
|
||||
html,body{margin:0;padding:0;width:100%;height:100%;background:#000;overflow:hidden}
|
||||
#screen{width:100%;height:100%;display:block}
|
||||
@@ -21,6 +22,18 @@
|
||||
<div id="screen"></div>
|
||||
<div id="banner" style="display:none"></div>
|
||||
<script type="module">
|
||||
// noVNC prints "noVNC requires a secure context (TLS). Expect crashes!" whenever
|
||||
// window.isSecureContext is false (i.e. plain http over a LAN IP). For ordinary
|
||||
// VNC-password auth noVNC uses its own pure-JS DES (core/des.js) and does NOT need
|
||||
// crypto.subtle, so the warning is purely cosmetic. Suppress exactly that one line
|
||||
// (let every other console.error through) by wrapping console.error before rfb.js
|
||||
// imports and binds Log.Error to it.
|
||||
const _origConsoleError = console.error.bind(console);
|
||||
const _SECURE_CTX_RE = /noVNC requires a secure context \(TLS\)/;
|
||||
console.error = function(...args) {
|
||||
if (args.length && typeof args[0] === "string" && _SECURE_CTX_RE.test(args[0])) return;
|
||||
_origConsoleError(...args);
|
||||
};
|
||||
const wsURL = (location.protocol === "https:" ? "wss://" : "ws://") + location.host + "/vnc";
|
||||
const statusURL = "/api/status";
|
||||
const banner = document.getElementById("banner");
|
||||
@@ -85,7 +98,7 @@ async function connect(){
|
||||
showBanner(`
|
||||
<h2>Disconnected</h2>
|
||||
<div>Reason: ${clean ? "connection closed" : "connection lost"}. See the browser console (F12) for the exact error.</div>
|
||||
<div class="hint">The "noVNC requires a secure context (TLS)" console warning is harmless for plain VNC-password auth. A real failure is usually a VNC password mismatch.</div>
|
||||
<div class="hint">A real failure is usually a VNC password mismatch. See the browser console (F12) for details.</div>
|
||||
<button onclick="location.reload()">Retry</button>`);
|
||||
});
|
||||
window.addEventListener("beforeunload", () => { try { rfb.disconnect(); } catch(e){} });
|
||||
|
||||
@@ -19,7 +19,7 @@ func (s *Server) renderLogin(w http.ResponseWriter, errMsg string) {
|
||||
const loginPageHTML = `<!doctype html>
|
||||
<html lang="en"><head><meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||
<title>Web VNC</title><style>
|
||||
<title>Web VNC</title><link rel="icon" href="/favicon.ico" type="image/x-icon"><style>
|
||||
*{box-sizing:border-box}
|
||||
body{font-family:system-ui,Segoe UI,sans-serif;background:#0f1720;color:#e2e8f0;display:flex;align-items:center;justify-content:center;height:100vh;margin:0}
|
||||
.card{background:#111827;padding:2rem 2.25rem;border-radius:14px;box-shadow:0 10px 40px rgba(0,0,0,.5);width:320px}
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
@echo off
|
||||
REM ============================================================
|
||||
REM open-firewall.bat - opens port 8080 in the Windows Firewall.
|
||||
REM Run as administrator (once). Or just launch it: it will request
|
||||
REM admin rights itself.
|
||||
REM ============================================================
|
||||
cd /d "%~dp0"
|
||||
|
||||
REM Admin check + auto-elevate.
|
||||
net session >nul 2>nul
|
||||
if errorlevel 1 (
|
||||
echo Requesting administrator rights ...
|
||||
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
|
||||
exit /b
|
||||
)
|
||||
|
||||
set PORT=8080
|
||||
set RULE=web-vnc
|
||||
|
||||
echo Removing the old rule (if any) ...
|
||||
netsh advfirewall firewall delete rule name="%RULE%" >nul 2>nul
|
||||
|
||||
echo Adding an allow rule for inbound TCP traffic on port %PORT% ...
|
||||
netsh advfirewall firewall add rule name="%RULE%" dir=in action=allow protocol=TCP localport=%PORT%
|
||||
if errorlevel 1 (
|
||||
echo [error] Could not add the rule.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo Done. Port %PORT% is open for inbound connections.
|
||||
echo You can now connect to web-vnc from other machines on the network at:
|
||||
echo http://THIS_MACHINE_IP:%PORT%
|
||||
echo.
|
||||
pause
|
||||
@@ -0,0 +1,58 @@
|
||||
@echo off
|
||||
REM ============================================================
|
||||
REM restart-autostart.bat - restart the "web-vnc" task so the
|
||||
REM running gateway reloads webvnc.conf (e.g. after set-password.bat
|
||||
REM changed the password). web-vnc.exe reads the hash and the VNC
|
||||
REM password only once at startup, so a restart is the only way to
|
||||
REM apply a new password to the live gateway.
|
||||
REM
|
||||
REM It first checks whether web-vnc.exe is actually running:
|
||||
REM - running -> stop the task (schtasks /End) and start it again;
|
||||
REM - not running -> just start it (no /End).
|
||||
REM Requires administrator rights (the task was created elevated), so it
|
||||
REM auto-elevates. Called from set-password.bat, or run manually.
|
||||
REM ============================================================
|
||||
cd /d "%~dp0"
|
||||
|
||||
net session >nul 2>nul
|
||||
if errorlevel 1 (
|
||||
echo Requesting administrator rights ...
|
||||
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
|
||||
exit /b
|
||||
)
|
||||
|
||||
set "TASK=web-vnc"
|
||||
|
||||
schtasks /Query /TN "%TASK%" >nul 2>nul
|
||||
if errorlevel 1 (
|
||||
echo [error] Task "%TASK%" is not installed. Run install-autostart.bat first.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM --- Is web-vnc.exe currently running? ---
|
||||
set "RUNNING=0"
|
||||
tasklist /FI "IMAGENAME eq web-vnc.exe" 2>nul | findstr /I /B /C:"web-vnc.exe" >nul
|
||||
if not errorlevel 1 set "RUNNING=1"
|
||||
|
||||
if "%RUNNING%"=="1" (
|
||||
echo web-vnc.exe is running - restarting task "%TASK%" ...
|
||||
schtasks /End /TN "%TASK%" >nul 2>nul
|
||||
REM give the previous process a moment to release port 8080
|
||||
timeout /t 2 /nobreak >nul
|
||||
) else (
|
||||
echo web-vnc.exe is NOT running - just starting task "%TASK%" ...
|
||||
)
|
||||
|
||||
schtasks /Run /TN "%TASK%"
|
||||
if errorlevel 1 (
|
||||
echo [error] Could not start the task.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo Done. web-vnc reloaded the password from webvnc.conf.
|
||||
echo Check it at http://localhost:8080
|
||||
echo.
|
||||
pause
|
||||
@@ -1,44 +1,46 @@
|
||||
@echo off
|
||||
@echo off
|
||||
REM ============================================================
|
||||
REM web-vnc launcher - запуск в один клик. Спрашивает только пароль.
|
||||
REM web-vnc launcher - starts the gateway without prompting.
|
||||
REM The password is set up once with set-password.bat (stored in
|
||||
REM webvnc.conf). If webvnc.conf is missing, this script tells you
|
||||
REM to run set-password.bat first.
|
||||
REM ============================================================
|
||||
chcp 65001 >nul
|
||||
cd /d "%~dp0"
|
||||
|
||||
echo.
|
||||
echo === web-vnc: VNC в браузере ===
|
||||
echo === web-vnc: VNC in the browser ===
|
||||
echo.
|
||||
|
||||
REM --- 1. Бинарник ---
|
||||
REM --- 1. Binary ---
|
||||
if exist "web-vnc.exe" goto havebin
|
||||
where go >nul 2>nul
|
||||
if not errorlevel 1 goto dogobuild
|
||||
echo [ошибка] web-vnc.exe не найден, а Go не установлен.
|
||||
echo Установите Go с https://go.dev/dl/ либо положите собранный web-vnc.exe рядом.
|
||||
echo [error] web-vnc.exe not found and Go is not installed.
|
||||
echo Install Go from https://go.dev/dl/ or place a built web-vnc.exe next to this script.
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
:dogobuild
|
||||
echo Собираю web-vnc.exe ...
|
||||
echo Building web-vnc.exe ...
|
||||
go build -o web-vnc.exe .\cmd\web-vnc
|
||||
if errorlevel 1 goto buildfail
|
||||
:havebin
|
||||
|
||||
REM --- 2. noVNC-клиент ---
|
||||
REM --- 2. noVNC client ---
|
||||
if exist "internal\server\static\core\rfb.js" goto havenovnc
|
||||
echo noVNC-клиент ещё не встроен. Пытаюсь скачать ...
|
||||
echo noVNC client is not bundled yet. Trying to download ...
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\get-novnc.ps1"
|
||||
if errorlevel 1 goto novncfail
|
||||
echo Пересобираю с noVNC ...
|
||||
echo Rebuilding with noVNC ...
|
||||
go build -o web-vnc.exe .\cmd\web-vnc
|
||||
goto havenovnc
|
||||
:novncfail
|
||||
echo [предупреждение] Не удалось скачать noVNC (нет интернета?).
|
||||
echo В браузере откроется страница с подсказкой. Повторите позже: scripts\get-novnc.ps1
|
||||
echo [warning] Could not download noVNC (no internet?).
|
||||
echo The browser will open a page with a hint. Retry later: scripts\get-novnc.ps1
|
||||
echo.
|
||||
:havenovnc
|
||||
|
||||
REM --- 3. VNC-сервер (поиск/загрузка) ---
|
||||
REM --- 3. VNC server (find/download) ---
|
||||
set "SPAWNARGS="
|
||||
set "SPAWN_CMD="
|
||||
if exist "vnc\winvnc.exe" goto uselocalvnc
|
||||
@@ -49,7 +51,7 @@ if exist "C:\Program Files\uvnc bvba\UltraVNC\winvnc.exe" goto autodetectvnc
|
||||
if exist "C:\Program Files (x86)\uvnc bvba\UltraVNC\winvnc.exe" goto autodetectvnc
|
||||
if exist "C:\Program Files\TightVNC\tvnserver.exe" goto autodetectvnc
|
||||
if exist "C:\Program Files (x86)\TightVNC\tvnserver.exe" goto autodetectvnc
|
||||
echo VNC-сервер не найден. Пытаюсь скачать портативный UltraVNC ...
|
||||
echo VNC server not found. Trying to download a portable UltraVNC ...
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\get-vnc.ps1"
|
||||
if errorlevel 1 goto novncserver
|
||||
if exist "vnc\winvnc.exe" goto uselocalvnc
|
||||
@@ -59,75 +61,69 @@ goto novncserver
|
||||
if exist "vnc\winvnc.exe" set "SPAWN_CMD=vnc\winvnc.exe -run"
|
||||
if exist "vnc\tvnserver.exe" if not defined SPAWN_CMD set "SPAWN_CMD=vnc\tvnserver.exe -run"
|
||||
set "SPAWNARGS=--spawn-command "%SPAWN_CMD%""
|
||||
echo Найден локальный VNC-сервер: %SPAWN_CMD%
|
||||
echo Found local VNC server: %SPAWN_CMD%
|
||||
goto vncdone
|
||||
:autodetectvnc
|
||||
echo VNC-сервер найден в системе (авто-определение при запуске).
|
||||
echo VNC server found in the system (auto-detection on start).
|
||||
goto vncdone
|
||||
:novncserver
|
||||
echo [предупреждение] VNC-сервер не удалось получить.
|
||||
echo Без VNC-сервера рабочий стол не будет транслироваться.
|
||||
echo Установите UltraVNC/TightVNC вручную или повторите: scripts\get-vnc.ps1
|
||||
echo [warning] Could not get a VNC server.
|
||||
echo Without a VNC server the desktop will not be streamed.
|
||||
echo Install UltraVNC/TightVNC manually or retry: scripts\get-vnc.ps1
|
||||
echo.
|
||||
:vncdone
|
||||
|
||||
REM --- 4. Пароль ---
|
||||
:getpw
|
||||
set "PW="
|
||||
set /p "PW=Введите пароль доступа: "
|
||||
if "%PW%"=="" goto emptypw
|
||||
goto gotpw
|
||||
:emptypw
|
||||
echo Пароль не может быть пустым.
|
||||
goto getpw
|
||||
:gotpw
|
||||
|
||||
REM --- 4b. Sync UltraVNC password with the one entered (only when it differs) ---
|
||||
echo Синхронизирую пароль UltraVNC с введённым. При несовпадении запросит права администратора...
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%"
|
||||
if errorlevel 1 echo [предупреждение] Не удалось синхронизировать пароль UltraVNC - продолжаю.
|
||||
|
||||
REM --- 5. Хэш пароля + тот же пароль для VNC-сервера ---
|
||||
echo Генерирую хэш пароля ...
|
||||
for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i"
|
||||
if "%HASH%"=="" goto hashfail
|
||||
REM Тот же пароль будет автоматически передан noVNC для авторизации на VNC-сервере.
|
||||
set "WEBVNC_VNC_PASSWORD=%PW%"
|
||||
set "PW="
|
||||
|
||||
REM --- 6. Доступные адреса ---
|
||||
REM --- 4. Stored password (set up once via set-password.bat) ---
|
||||
if not exist "webvnc.conf" goto nopwconf
|
||||
set "HASH="
|
||||
set "VNC_PW="
|
||||
for /f "tokens=1,* delims==" %%a in (webvnc.conf) do (
|
||||
if /i "%%a"=="HASH" set "HASH=%%b"
|
||||
if /i "%%a"=="VNC_PASSWORD" set "VNC_PW=%%b"
|
||||
)
|
||||
if "%HASH%"=="" goto nopwconf
|
||||
if "%VNC_PW%"=="" goto nopwconf
|
||||
REM The same password is auto-sent to noVNC to authenticate against the VNC server.
|
||||
set "WEBVNC_VNC_PASSWORD=%VNC_PW%"
|
||||
set "VNC_PW="
|
||||
goto havepw
|
||||
:nopwconf
|
||||
echo [error] Password is not configured yet.
|
||||
echo Run set-password.bat once to set the password, then start run.bat.
|
||||
echo.
|
||||
echo === Адреса для подключения (порт 8080) ===
|
||||
pause
|
||||
exit /b 1
|
||||
:havepw
|
||||
|
||||
REM --- 5. Available addresses ---
|
||||
echo.
|
||||
echo === Addresses to connect to (port 8080) ===
|
||||
echo http://localhost:8080
|
||||
for /f "delims=" %%a in ('powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\list-ips.ps1"') do echo http://%%a:8080
|
||||
echo.
|
||||
echo Если с другой машины не открывается - один раз выполните от имени
|
||||
echo администратора: scripts\open-firewall.bat
|
||||
echo If it does not open from another machine, run once as administrator:
|
||||
echo open-firewall.bat
|
||||
echo.
|
||||
|
||||
REM --- 7. Запуск ---
|
||||
echo Запускаю web-vnc на http://localhost:8080
|
||||
echo Остановить: Ctrl+C
|
||||
REM --- 6. Launch ---
|
||||
echo Starting web-vnc on http://localhost:8080
|
||||
echo Stop: Ctrl+C
|
||||
echo.
|
||||
REM --- 6b. 5900 already listening? -> do NOT spawn a 2nd VNC server (avoid conflict with the UltraVNC service) ---
|
||||
set "SPAWNFLAG=--spawn"
|
||||
powershell -NoProfile -Command "try{$c=New-Object Net.Sockets.TcpClient('127.0.0.1',5900);$c.Close();exit 0}catch{exit 1}"
|
||||
if not errorlevel 1 (
|
||||
echo VNC-сервер уже слушает 127.0.0.1:5900 - подключаюсь к нему без --spawn.
|
||||
echo VNC server already listening on 127.0.0.1:5900 - connecting to it without --spawn.
|
||||
set "SPAWNFLAG="
|
||||
set "SPAWNARGS="
|
||||
)
|
||||
web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080
|
||||
echo.
|
||||
echo Сервер остановлен.
|
||||
echo Server stopped.
|
||||
pause
|
||||
exit /b
|
||||
|
||||
:buildfail
|
||||
echo Сборка не удалась.
|
||||
pause
|
||||
exit /b 1
|
||||
|
||||
:hashfail
|
||||
echo [ошибка] Не удалось сгенерировать хэш пароля.
|
||||
echo Build failed.
|
||||
pause
|
||||
exit /b 1
|
||||
@@ -0,0 +1,105 @@
|
||||
@echo off
|
||||
REM ============================================================
|
||||
REM autostart-run.bat - launcher used by the scheduled task
|
||||
REM created by install-autostart.bat. Runs in a VISIBLE console
|
||||
REM window (install-autostart.bat registers it at logon, as the
|
||||
REM current user, so the window is visible - unlike a hidden
|
||||
REM SYSTEM/boot task). It reads the password from webvnc.conf,
|
||||
REM WAITS for the VNC server on 127.0.0.1:5900 (the UltraVNC
|
||||
REM service may still be starting), and only then starts
|
||||
REM web-vnc.exe in the foreground. If no VNC server comes up,
|
||||
REM it spawns a local one. On any fatal error it pauses so the
|
||||
REM window stays open and you can read why it did not start.
|
||||
REM
|
||||
REM This script lives in scripts/ but operates relative to the
|
||||
REM REPO ROOT (web-vnc.exe, webvnc.conf, vnc\, ./cmd/web-vnc are
|
||||
REM there), so it cd's to %~dp0.. first.
|
||||
REM Exit codes: 0 = server ran and stopped; 1 = no binary;
|
||||
REM 2 = password not configured; other = web-vnc error.
|
||||
REM ============================================================
|
||||
title web-vnc autostart
|
||||
cd /d "%~dp0.."
|
||||
|
||||
echo.
|
||||
echo === web-vnc autostart ===
|
||||
echo Working dir: %CD%
|
||||
echo.
|
||||
|
||||
REM --- 1. Binary (build if Go is available, else fail) ---
|
||||
if exist "web-vnc.exe" goto havebin
|
||||
where go >nul 2>nul
|
||||
if errorlevel 1 goto nobinary
|
||||
echo Building web-vnc.exe ...
|
||||
go build -o web-vnc.exe .\cmd\web-vnc
|
||||
if errorlevel 1 goto nobinary
|
||||
:havebin
|
||||
if not exist "web-vnc.exe" goto nobinary
|
||||
|
||||
REM --- 2. Stored password ---
|
||||
if not exist "webvnc.conf" goto noconf
|
||||
set "HASH="
|
||||
set "VNC_PW="
|
||||
for /f "tokens=1,* delims==" %%a in (webvnc.conf) do (
|
||||
if /i "%%a"=="HASH" set "HASH=%%b"
|
||||
if /i "%%a"=="VNC_PASSWORD" set "VNC_PW=%%b"
|
||||
)
|
||||
if "%HASH%"=="" goto noconf
|
||||
if "%VNC_PW%"=="" goto noconf
|
||||
set "WEBVNC_VNC_PASSWORD=%VNC_PW%"
|
||||
set "VNC_PW="
|
||||
|
||||
REM --- 3. Wait for the VNC server on 127.0.0.1:5900 ---
|
||||
REM At boot/logon the UltraVNC service may still be starting.
|
||||
REM Poll up to ~30 s (one PowerShell process loops internally) so we do
|
||||
REM NOT spawn a 2nd server and do NOT serve before the VNC server is
|
||||
REM ready. Exits 0 as soon as 5900 accepts a connection, 1 on timeout.
|
||||
echo Waiting for VNC server on 127.0.0.1:5900 (up to 30 s) ...
|
||||
powershell -NoProfile -Command "for($i=0;$i -lt 30;$i++){try{$c=New-Object Net.Sockets.TcpClient('127.0.0.1',5900);$c.Close();exit 0}catch{};Start-Sleep -Seconds 1};exit 1"
|
||||
if not errorlevel 1 goto vnc_up
|
||||
|
||||
:vnc_down
|
||||
echo VNC server is not up after the wait.
|
||||
set "SPAWN_CMD="
|
||||
if exist "vnc\winvnc.exe" set "SPAWN_CMD=vnc\winvnc.exe -run"
|
||||
if exist "vnc\tvnserver.exe" if not defined SPAWN_CMD set "SPAWN_CMD=vnc\tvnserver.exe -run"
|
||||
if defined SPAWN_CMD goto have_spawn
|
||||
set "SPAWNARGS="
|
||||
set "SPAWNFLAG=--spawn"
|
||||
echo No local VNC server; web-vnc will auto-detect and spawn one.
|
||||
goto launch
|
||||
:have_spawn
|
||||
set "SPAWNARGS=--spawn-command "%SPAWN_CMD%""
|
||||
set "SPAWNFLAG=--spawn"
|
||||
echo Starting local VNC server: %SPAWN_CMD%
|
||||
goto launch
|
||||
|
||||
:vnc_up
|
||||
echo VNC server is up - connecting to it without --spawn.
|
||||
set "SPAWNARGS="
|
||||
set "SPAWNFLAG="
|
||||
|
||||
:launch
|
||||
REM --- 4. Launch (foreground; the console window stays open while it serves) ---
|
||||
echo.
|
||||
echo Starting web-vnc on http://localhost:8080
|
||||
echo Close this window to stop it.
|
||||
echo.
|
||||
web-vnc.exe --password-hash "%HASH%" %SPAWNARGS% %SPAWNFLAG% --listen :8080
|
||||
echo.
|
||||
echo Server stopped (exit code %errorlevel%).
|
||||
pause
|
||||
exit /b
|
||||
|
||||
:nobinary
|
||||
echo.
|
||||
echo [error] web-vnc.exe not found and could not be built.
|
||||
echo Build it once with: go build -o web-vnc.exe .\cmd\web-vnc
|
||||
echo or run run.bat interactively.
|
||||
pause
|
||||
exit /b 1
|
||||
|
||||
:noconf
|
||||
echo.
|
||||
echo [error] webvnc.conf not found. Run set-password.bat first to set the password.
|
||||
pause
|
||||
exit /b 2
|
||||
@@ -1,37 +0,0 @@
|
||||
@echo off
|
||||
REM ============================================================
|
||||
REM open-firewall.bat - открывает порт 8080 в Windows Firewall.
|
||||
REM Запускать от имени администратора (один раз).
|
||||
REM Либо запустите дважды: файл сам запросит права администратора.
|
||||
REM ============================================================
|
||||
chcp 65001 >nul
|
||||
cd /d "%~dp0"
|
||||
|
||||
REM Проверка прав администратора и авто-повышение.
|
||||
net session >nul 2>nul
|
||||
if errorlevel 1 (
|
||||
echo Запрос прав администратора ...
|
||||
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
|
||||
exit /b
|
||||
)
|
||||
|
||||
set PORT=8080
|
||||
set RULE=web-vnc
|
||||
|
||||
echo Удаляю старое правило (если есть) ...
|
||||
netsh advfirewall firewall delete rule name="%RULE%" >nul 2>nul
|
||||
|
||||
echo Добавляю разрешающее правило для входящего TCP-трафика на порт %PORT% ...
|
||||
netsh advfirewall firewall add rule name="%RULE%" dir=in action=allow protocol=TCP localport=%PORT%
|
||||
if errorlevel 1 (
|
||||
echo [ошибка] Не удалось добавить правило.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo.
|
||||
echo Готово. Порт %PORT% открыт для входящих подключений.
|
||||
echo Теперь к web-vnc можно подключаться с других машин сети по адресу:
|
||||
echo http://IP_ЭТОЙ_МАШИНЫ:%PORT%
|
||||
echo.
|
||||
pause
|
||||
@@ -0,0 +1,111 @@
|
||||
@echo off
|
||||
REM ============================================================
|
||||
REM set-password.bat - setup of the web access password.
|
||||
REM Asks for the password, generates a hash and saves it together
|
||||
REM with the VNC password to webvnc.conf (gitignored). AFTER that
|
||||
REM (so the web password is configured even if the next step fails)
|
||||
REM it syncs the UltraVNC service password via ensure-vnc-password.ps1.
|
||||
REM
|
||||
REM If the "web-vnc" autostart task is installed, this script also
|
||||
REM restarts it (elevated, via restart-autostart.bat) so the
|
||||
REM running gateway reloads the new password. The restart is skipped
|
||||
REM only when the password did not actually change. restart-autostart.bat
|
||||
REM checks whether web-vnc.exe is running and stops+starts it, or just
|
||||
REM starts it.
|
||||
REM ============================================================
|
||||
cd /d "%~dp0"
|
||||
|
||||
echo.
|
||||
echo === web-vnc: password setup ===
|
||||
echo.
|
||||
|
||||
REM --- 1. Binary (needed for --gen-hash) ---
|
||||
if exist "web-vnc.exe" goto havebin
|
||||
where go >nul 2>nul
|
||||
if errorlevel 1 (
|
||||
echo [error] web-vnc.exe not found and Go is not installed.
|
||||
echo Build it first with: go build -o web-vnc.exe .\cmd\web-vnc
|
||||
echo or run run.bat once interactively.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo Building web-vnc.exe ...
|
||||
go build -o web-vnc.exe .\cmd\web-vnc
|
||||
if errorlevel 1 (
|
||||
echo Build failed.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
:havebin
|
||||
|
||||
REM --- 2. Remember the previous password (to detect a real change) ---
|
||||
set "OLD_PW="
|
||||
if exist "webvnc.conf" (
|
||||
for /f "tokens=1,* delims==" %%a in (webvnc.conf) do if /i "%%a"=="VNC_PASSWORD" set "OLD_PW=%%b"
|
||||
)
|
||||
|
||||
REM --- 3. Ask password ---
|
||||
:getpw
|
||||
set "PW="
|
||||
set /p "PW=Enter access password (ASCII, max 8 chars for VNC): "
|
||||
if "%PW%"=="" (
|
||||
echo Password cannot be empty.
|
||||
goto getpw
|
||||
)
|
||||
|
||||
REM --- 4. Generate hash ---
|
||||
echo Generating password hash ...
|
||||
set "HASH="
|
||||
for /f "delims=" %%i in ('web-vnc.exe --gen-hash "%PW%"') do set "HASH=%%i"
|
||||
if "%HASH%"=="" (
|
||||
echo [error] Could not generate the password hash.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM --- 5. Save to webvnc.conf (overwrite) ---
|
||||
REM Done BEFORE the UltraVNC sync so the web password is configured
|
||||
REM even if the sync below fails or is cancelled (UAC).
|
||||
echo HASH=%HASH%> "webvnc.conf"
|
||||
echo VNC_PASSWORD=%PW%>> "webvnc.conf"
|
||||
set "HASH="
|
||||
echo Saved to webvnc.conf.
|
||||
|
||||
REM --- 6. Sync UltraVNC service password (UAC only if it differs) ---
|
||||
echo Syncing UltraVNC password with the one entered ...
|
||||
powershell -NoProfile -ExecutionPolicy Bypass -File "%~dp0scripts\ensure-vnc-password.ps1" -Password "%PW%"
|
||||
if errorlevel 1 echo [warning] Could not sync the UltraVNC password - the web password is still saved.
|
||||
|
||||
REM --- 7. Apply to the running gateway (if the autostart task is installed) ---
|
||||
REM web-vnc.exe reads the hash + VNC password only at startup, so a
|
||||
REM restart is required for the new password to take effect.
|
||||
schtasks /Query /TN "web-vnc" >nul 2>nul
|
||||
if errorlevel 1 goto no_task
|
||||
|
||||
REM Skip the restart if the password did not change (the running gateway
|
||||
REM already accepts it; PBKDF2 hash is always new due to salt, so we compare
|
||||
REM the entered password with the old VNC_PASSWORD from webvnc.conf).
|
||||
if not defined OLD_PW goto do_restart
|
||||
if /i not "%OLD_PW%"=="%PW%" goto do_restart
|
||||
echo.
|
||||
echo Password unchanged - the running gateway keeps accepting it. No restart needed.
|
||||
echo If the gateway is not running, start it with: restart-autostart.bat ^(admin^)
|
||||
goto cleanup
|
||||
|
||||
:do_restart
|
||||
echo.
|
||||
echo Applying the new password to the "web-vnc" task ^(needs admin^) ...
|
||||
powershell -NoProfile -Command "Start-Process -FilePath '%~dp0restart-autostart.bat' -Verb RunAs -Wait"
|
||||
goto cleanup
|
||||
|
||||
:no_task
|
||||
echo.
|
||||
echo Autostart task "web-vnc" is not installed.
|
||||
echo To start on every boot, run once as administrator:
|
||||
echo install-autostart.bat
|
||||
|
||||
:cleanup
|
||||
set "PW="
|
||||
set "OLD_PW="
|
||||
echo.
|
||||
pause
|
||||
@@ -0,0 +1,26 @@
|
||||
@echo off
|
||||
REM ============================================================
|
||||
REM uninstall-autostart.bat - remove the web-vnc startup task.
|
||||
REM Deletes the scheduled task "web-vnc" created by
|
||||
REM install-autostart.bat. Requires administrator rights
|
||||
REM (auto-elevates).
|
||||
REM ============================================================
|
||||
cd /d "%~dp0"
|
||||
|
||||
net session >nul 2>nul
|
||||
if errorlevel 1 (
|
||||
echo Requesting administrator rights ...
|
||||
powershell -Command "Start-Process -FilePath '%~f0' -Verb RunAs"
|
||||
exit /b
|
||||
)
|
||||
|
||||
set "TASK=web-vnc"
|
||||
echo Removing scheduled task "%TASK%" ...
|
||||
schtasks /Delete /TN "%TASK%" /F
|
||||
if errorlevel 1 (
|
||||
echo [error] Could not remove the task (maybe it does not exist).
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
echo Done.
|
||||
pause
|
||||
Reference in New Issue
Block a user