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:
+14
-2
@@ -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.
|
die Kamera in S3 prüft man in einem Browserfenster.
|
||||||
|
|
||||||
```bash
|
```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
|
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:
|
Was es mitbringt, ohne weitere Einrichtung:
|
||||||
|
|
||||||
- **Zwischenablage in beide Richtungen.** Auf dem Telefon kopieren, auf dem PC
|
- **Zwischenablage in beide Richtungen.** Auf dem Telefon kopieren, auf dem PC
|
||||||
|
|||||||
Executable
+141
@@ -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
|
||||||
Reference in New Issue
Block a user