install-scrcpy.sh statt apt — in Debian 12 gibt es das Paket nicht

Meine Anweisung 'sudo apt install scrcpy' war falsch: scrcpy ist in bookworm gar
nicht enthalten, und wo es existiert (ab trixie-backports) liegt es in contrib
statt main. 'Paket kann nicht gefunden werden' war also die richtige Antwort des
Systems, kein Konfigurationsfehler.

Das Projekt liefert ein eigenständiges Linux-Paket. Gegen das System geprüft:
keine fehlenden Bibliotheken, läuft ohne root. Installiert wird nach ~/.local,
Rückbau mit --deinstallieren.

Wichtiger Teil ist der erzeugte Starter: das Paket bringt ein eigenes adb mit,
hier 37.0.0 gegen 36.0.0 im System. Trifft ein abweichendes adb auf einen
laufenden Server, beendet es ihn — und kappt damit mitten in der Arbeit die
WLAN-Verbindung zum Telefon. Der Starter schiebt scrcpy deshalb dasselbe adb
unter, das auch die Provisioning-Skripte benutzen.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Stefan
2026-08-10 21:33:10 +02:00
co-authored by Claude Opus 5
parent 14f054c8e3
commit 3c41623e52
2 changed files with 155 additions and 2 deletions
+13 -1
View File
@@ -38,10 +38,22 @@ Für alles Grafische unverzichtbar: Beweis S1 zeigt sich nur auf dem Bildschirm,
die Kamera in S3 prüft man in einem Browserfenster.
```bash
sudo apt install scrcpy # Debian/Ubuntu
./tools/install-scrcpy.sh # holt das offizielle Linux-Paket nach ~/.local
scrcpy # nutzt die bestehende adb-Verbindung, auch über WLAN
```
**`apt install scrcpy` funktioniert auf Debian 12 nicht** — dort ist das Paket gar
nicht enthalten, und ab trixie-backports liegt es in `contrib` statt `main`. Das
Projekt liefert aber ein eigenständiges Linux-Paket ohne Systemabhängigkeiten, und
genau das holt das Skript. Kein root, alles unter `~/.local`, Rückbau mit
`--deinstallieren`.
Das Skript legt dabei einen Starter an, der scrcpy **dasselbe adb unterschiebt**, das
auch die Provisioning-Skripte benutzen. Das ist kein Schönheitsfehler: das Paket
bringt eine eigene, oft neuere adb-Fassung mit, und ein abweichendes adb beendet einen
laufenden Server — was mitten in der Arbeit die WLAN-Verbindung zum Telefon kappen
würde.
Was es mitbringt, ohne weitere Einrichtung:
- **Zwischenablage in beide Richtungen.** Auf dem Telefon kopieren, auf dem PC
+141
View File
@@ -0,0 +1,141 @@
#!/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" <<STARTER_ENDE
#!/bin/sh
# Erzeugt von tools/install-scrcpy.sh — nicht von Hand ändern.
# Setzt bewusst dasselbe adb wie die Provisioning-Skripte: ein abweichendes
# beendet den laufenden adb-Server und trennt damit das Telefon.
[ -n "\${ADB:-}" ] || ADB="${SYSTEM_ADB:-$ZIEL/adb}"
export ADB
export SCRCPY_SERVER_PATH="$ZIEL/scrcpy-server"
exec "$ZIEL/scrcpy" "\$@"
STARTER_ENDE
chmod +x "$STARTER"
ok "Starter: $STARTER"
# ── Prüfen ───────────────────────────────────────────────────────────────────
kopf "Prüfen"
if FEHLT=$(ldd "$ZIEL/scrcpy" 2>/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