#!/usr/bin/env bash # HPOS — scrcpy installieren. Läuft auf dem RECHNER, nicht auf dem Telefon. # # scrcpy ist in Debian 12 nicht enthalten; erst ab trixie-backports, und dort in # contrib statt main. 'apt install scrcpy' scheitert deshalb mit "Paket kann nicht # gefunden werden". Das Projekt liefert aber ein eigenständiges Linux-Paket, das # ohne Systemabhängigkeiten und ohne root auskommt. # # Installiert wird nach ~/.local — nichts außerhalb des Benutzerverzeichnisses. # # Aufruf: ./tools/install-scrcpy.sh [--deinstallieren] set -uo pipefail ZIEL="$HOME/.local/opt/scrcpy" STARTER="$HOME/.local/bin/scrcpy" if [ -t 1 ]; then C_OK=$'\033[32m'; C_WARN=$'\033[33m'; C_ERR=$'\033[31m' C_HEAD=$'\033[1;36m'; C_DIM=$'\033[2m'; C_OFF=$'\033[0m' else C_OK=""; C_WARN=""; C_ERR=""; C_HEAD=""; C_DIM=""; C_OFF="" fi kopf() { printf '\n%s══ %s ══%s\n' "$C_HEAD" "$*" "$C_OFF"; } ok() { printf '%s ✓%s %s\n' "$C_OK" "$C_OFF" "$*"; } warn() { printf '%s !%s %s\n' "$C_WARN" "$C_OFF" "$*"; } fehl() { printf '%s ✗%s %s\n' "$C_ERR" "$C_OFF" "$*"; } hinweis() { printf '%s %s%s\n' "$C_DIM" "$*" "$C_OFF"; } if [ "${1:-}" = "--deinstallieren" ]; then rm -rf "$ZIEL" "$STARTER" ok "Entfernt: $ZIEL und $STARTER" exit 0 fi command -v curl >/dev/null 2>&1 || { fehl "curl wird gebraucht."; exit 1; } command -v tar >/dev/null 2>&1 || { fehl "tar wird gebraucht."; exit 1; } case "$(uname -m)" in x86_64|amd64) ARCH=x86_64 ;; aarch64|arm64) ARCH=aarch64 ;; *) fehl "Keine fertigen Pakete für $(uname -m). Dann aus den Quellen bauen."; exit 1 ;; esac # ── Herunterladen ──────────────────────────────────────────────────────────── kopf "Aktuelle Fassung ermitteln" URL=$(curl -sfL https://api.github.com/repos/Genymobile/scrcpy/releases/latest \ | python3 -c " import json, sys d = json.load(sys.stdin) for a in d['assets']: if a['name'].startswith('scrcpy-linux-$ARCH') and a['name'].endswith('.tar.gz'): print(a['browser_download_url']) break " 2>/dev/null) if [ -z "$URL" ]; then fehl "Kein passendes Paket für linux-$ARCH gefunden." hinweis "Releases prüfen: https://github.com/Genymobile/scrcpy/releases" exit 1 fi ok "$(basename "$URL")" kopf "Herunterladen" TMP=$(mktemp -d) trap 'rm -rf "$TMP"' EXIT if ! curl -fL --progress-bar -o "$TMP/s.tar.gz" "$URL"; then fehl "Download fehlgeschlagen." exit 1 fi tar xzf "$TMP/s.tar.gz" -C "$TMP" || { fehl "Entpacken fehlgeschlagen."; exit 1; } QUELLE=$(find "$TMP" -maxdepth 1 -type d -name 'scrcpy-linux-*' | head -1) [ -n "$QUELLE" ] || { fehl "Unerwarteter Aufbau des Archivs."; exit 1; } kopf "Installieren" rm -rf "$ZIEL" mkdir -p "$(dirname "$ZIEL")" "$(dirname "$STARTER")" mv "$QUELLE" "$ZIEL" chmod +x "$ZIEL/scrcpy" "$ZIEL/adb" 2>/dev/null || true ok "nach $ZIEL" # ── Starter mit passendem adb ──────────────────────────────────────────────── # Das Paket bringt ein eigenes adb mit, das neuer sein kann als das im System. # Trifft ein anderes adb auf einen laufenden Server, beendet es ihn — und genau # das kappt eine bestehende WLAN-Verbindung zum Telefon mitten in der Arbeit. # Deshalb bekommt scrcpy dasselbe adb wie die übrigen Skripte. SYSTEM_ADB="" for k in "${ADB:-}" "$HOME/Android/Sdk/platform-tools/adb" $(command -v adb 2>/dev/null); do [ -n "$k" ] && [ -x "$k" ] && { SYSTEM_ADB="$k"; break; } done if [ -n "$SYSTEM_ADB" ]; then V_SYS=$("$SYSTEM_ADB" version 2>/dev/null | sed -n 2p) V_MIT=$("$ZIEL/adb" version 2>/dev/null | sed -n 2p) hinweis "System-adb: $V_SYS" hinweis "Mitgeliefert: $V_MIT" if [ "$V_SYS" != "$V_MIT" ]; then warn "Verschiedene Fassungen — scrcpy bekommt das System-adb," hinweis "sonst würde der adb-Server neu starten und die WLAN-Verbindung abreißen." fi fi cat >"$STARTER" </dev/null | grep 'not found'); then fehl "Fehlende Bibliotheken:" printf '%s\n' "$FEHLT" | sed 's/^/ /' exit 1 fi ok "Keine fehlenden Bibliotheken" ok "$("$STARTER" --version 2>&1 | head -1)" case ":$PATH:" in *":$HOME/.local/bin:"*) ok "~/.local/bin liegt in PATH" ;; *) warn "~/.local/bin fehlt in PATH" hinweis "In ~/.bashrc ergänzen: export PATH=\"\$HOME/.local/bin:\$PATH\"" ;; esac kopf "Loslegen" cat <<'TEXT' scrcpy Bildschirm spiegeln, Zwischenablage beidseitig scrcpy --max-size 1024 weniger Bandbreite, flüssiger über WLAN scrcpy --turn-screen-off Telefonbildschirm aus, spart Akku scrcpy --stay-awake Bildschirm bleibt an, solange gespiegelt wird Tastatur und Maus des Rechners wirken direkt im Telefon — auch in Termux. Deinstallieren: ./tools/install-scrcpy.sh --deinstallieren TEXT