Erkenntnis aus dem Live-Test: bei gesperrtem Bildschirm greifen Gesten/Tasten nicht (Android-Sicherheit), der Agent meldete aber still 'ok' -> Verwirrung (home,home,home, Screenshot zeigt trotzdem alte App). Fix: KeyguardManager. isKeyguardLocked() gate fuer Steuer-Aktionen (ui_tap/text/swipe/key/app_launch) -> klare Meldung 'Geraet ist gesperrt - bitte entsperren'. Sehen (screenshot/ ui_dump/info) bleibt auch gesperrt erlaubt. README-Hinweis ergaenzt. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ARIA Host-Agent
Ein schlanker Agent, der direkt auf einem Rechner läuft und ARIA erlaubt, diesen Rechner zu steuern — auch wenn er sonst aus dem Netz nicht erreichbar ist (hinter NAT/Firewall, kein offener Port). Der Agent verbindet sich ausgehend zum RVS (gleicher Token wie der Rest von ARIA).
Unterschied zum Satelliten: der Satellit entdeckt und steuert andere Geräte in einem LAN; der Host-Agent steuert den Rechner, auf dem er läuft.
Fähigkeiten
| Aktion | Was |
|---|---|
exec |
Shell-Kommando ausführen (optional sudo), stdout/stderr/exit |
read |
Datei lesen (Base64, mit Offset/Limit) |
write |
Datei schreiben/anhängen (Base64 oder Text) |
info |
OS, CPU/RAM/Disk-Auslastung, Uptime, IP |
screenshot |
Bildschirmfoto (X11: scrot/maim · Wayland: grim) |
ARIA nutzt diese über die Brain-Tools host_list / host_exec / host_read /
host_write / host_info / host_screenshot.
Plattformen
Eine Codebasis, läuft auf Linux, macOS und Windows (der Agent wählt Shell, Screenshot-Methode und Root/Admin-Check je OS automatisch):
| exec | Root/Admin | Screenshot | |
|---|---|---|---|
| Linux | bash -lc |
sudo (SUDO_PASSWORD/SUDO_NOPASSWD) / root |
grim (Wayland) · scrot/maim (X11) |
| macOS | bash -lc |
sudo (wie Linux) | screencapture (Bordmittel) |
| Windows | PowerShell | Agent als Administrator starten (kein sudo) | PowerShell/System.Drawing (Bordmittel) |
PyInstaller kann nicht cross-kompilieren — jede Binary wird auf ihrem OS gebaut.
Bauen
Linux (portabel, empfohlen) — Docker-Container mit altem glibc:
./build.sh # -> dist/aria-host-agent (~15 MB, läuft auf vielen Distros)
Linux/macOS ohne Docker — PyInstaller direkt (linkt gegen lokales glibc/OS):
./build-native.sh # -> dist/aria-host-agent
Windows — nativ (auf einem Windows-Rechner, Python 3 im PATH nötig):
build-native.bat REM -> dist\aria-host-agent.exe
Windows — aus Docker heraus (auf Linux!), inkl. Installer — Wine baut die
.exe, NSIS packt ein setup.exe, das den Agent als Windows-Dienst einrichtet:
./build-win.sh [version]
# -> dist/aria-host-agent.exe (Konsolen-Binary)
# -> dist/aria-host-agent-setup.exe (Installer: Dienst + .env in ProgramData)
Der erste Lauf zieht das tobix/pywine-Image (~1–2 GB) und richtet die Wine-
Python-Umgebung ein — das dauert; Folge-Builds sind schnell. PyInstaller kann
nicht cross-compilen, deshalb der Wine-Umweg. macOS geht so NICHT (Apple
lässt sich nicht legal aus Docker bauen) — dort ./build-native.sh auf einem Mac.
Docker scheitert? (Live-ISO / overlayfs-Root)
Wenn build.sh mit failed to mount … overlayfs … invalid argument abbricht,
läufst du wahrscheinlich auf einem Live-System (Live-ISO). Dessen Root ist
selbst ein overlayfs, und Dockers overlay2-Treiber kann kein Overlay-auf-
Overlay stapeln. Zwei Auswege:
- Empfohlen: Binary auf einem normal installierten Linux bauen (
./build.sh) und nur die fertigedist/aria-host-agentaufs Live-System kopieren. Die Binary ist portabel — Ziel braucht weder Docker noch Python. - Nativ bauen (ohne Docker):
Achtung: nativ gebaut linkt die Binary gegen das glibc dieser Maschine — sie läuft dann nur auf Systemen mit gleichem oder neuerem glibc.
sudo apt install -y python3-pip python3-venv ./build-native.sh
Installieren
dist/aria-host-agentauf den Ziel-Rechner kopieren..env.example→.envdaneben, RVS-Zugang +CONTROL_ENABLED=trueeintragen.- Starten:
chmod +x aria-host-agent && ./aria-host-agent
Als systemd-Dienst (empfohlen für Dauerbetrieb)
Der Installer kopiert Binary + .env an ihre Plätze und richtet den Dienst ein:
# .env-Pfad direkt übergeben:
sudo ./install-service.sh /pfad/zur/.env
# ODER ohne Argument -> ncurses-Dateidialog (dialog) zum Auswählen der .env:
sudo ./install-service.sh
Er legt ab:
- Binary →
/usr/local/bin/aria-host-agent .env→/etc/aria-host-agent/.env(Rechte0600, enthält Token/Passwörter)- Unit →
/etc/systemd/system/aria-host-agent.service, dannenable --now.
Danach: systemctl status aria-host-agent · journalctl -u aria-host-agent -f.
Die Binary sucht er unter dist/aria-host-agent bzw. ./aria-host-agent (oder
2. Argument). Braucht dialog für den Dateibrowser (bietet die Installation an).
Windows-Dienst (setup.exe)
aria-host-agent-setup.exe (aus build-win.sh oder dem Gitea-Release) als
Administrator ausführen. Der Installer:
- kopiert die
.exenach%ProgramFiles%\ARIA Host-Agent, - legt
%ProgramData%\ARIA-Host-Agent\.envan (nur falls noch keine da ist), - richtet über nssm den Dienst ARIA Host-Agent ein (Autostart) und startet ihn.
Danach die .env unter %ProgramData%\ARIA-Host-Agent\ mit RVS-Zugang +
CONTROL_ENABLED=true füllen und den Dienst neu starten (services.msc →
ARIA Host-Agent, oder nssm restart ARIAHostAgent). Deinstallation über
Apps & Features → ARIA Host-Agent (die .env in ProgramData bleibt erhalten).
Release (Binaries als Gitea-Assets)
release_agent.sh <version> baut alles Docker-Baubare und hängt es als
Release-Asset an den Tag agent-v<version> — nichts landet im Git-Tree:
./release_agent.sh 0.2.0 # Linux + Android + Windows (Wine)
SKIP_WINDOWS=1 ./release_agent.sh 0.2.0 # ohne Windows (schneller)
Assets: aria-host-agent-linux-x64, aria-host-agent-android-agent-v<v>.apk,
aria-host-agent-windows.exe, aria-host-agent-windows-setup.exe. macOS ist
nicht Docker-baubar — auf einem Mac ./build-native.sh laufen lassen und das
Ergebnis vor dem Release nach dist/aria-host-agent-macos legen, dann nimmt das
Skript es automatisch mit. Gitea-Zugang via .env/Umgebung (GITEA_URL,
GITEA_REPO, GITEA_USER), Kennwort wird abgefragt.
TLS / SNI — Agent im selben Netz wie der RVS
Steht der Rechner im selben Netz wie der RVS (z.B. Rechenzentrum) und soll
direkt auf dessen interne IP verbinden (kein NAT-Hairpin über den externen
Hostnamen), scheitert der TLS-Handshake sonst an tlsv1 alert internal error
(Caddy hat kein Zertifikat für die IP). Lösung — in der .env:
RVS_HOST=10.0.0.2 # interne RVS-IP
RVS_SNI=example.com # Name, für den das Caddy-Zert gilt
Der Agent verbindet dann auf die IP, präsentiert aber den Namen im TLS-SNI.
Zuhause / im Normalfall RVS_SNI leer lassen und den Hostnamen als RVS_HOST.
sudo
Vier Fälle, der Agent wählt automatisch:
- Agent läuft als root (z.B. systemd
User=root) → volle Rechte, kein sudo nötig. SUDO_PASSWORD=…in der.env→sudo -Smit Passwort.SUDO_NOPASSWD=true→sudo -n(Live-ISO / passwortloses sudo, z.B. Linux Mint vom Stick).- sonst → sudo-Kommandos scheitern mit klarer Meldung.
Sicherheit
- Reagiert nur auf den eigenen RVS-Raum (Token) und nur, wenn
CONTROL_ENABLED=true. - Keine offenen Ports (reiner ausgehender Client).
- Alle Kommandos werden geloggt.
- Der Agent gibt vollen Zugriff auf den Rechner — nur auf Maschinen einsetzen, denen du ARIA anvertraust.
Hinweis Screenshot
Als Systemdienst fehlt die grafische Session. Für screenshot den Agent in der
Desktop-Session starten (Autostart) oder DISPLAY/XAUTHORITY in der Unit setzen.