From 915fe53eeb510b7d790d0759f947459989f8c620 Mon Sep 17 00:00:00 2001 From: Stefan Date: Sun, 9 Aug 2026 18:12:57 +0200 Subject: [PATCH] =?UTF-8?q?Mehrere=20Ger=C3=A4te=20gleichzeitig=20unterst?= =?UTF-8?q?=C3=BCtzen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ein bereits verbundenes Gerät war bisher ein Grund auszusteigen, und provision.sh brach bei mehr als einem sogar ab. Beim Gerätewechsel ist genau das aber der Normalfall: altes und neues Telefon müssen zusammen erreichbar sein, sonst lässt sich nichts klonen. adb-wireless.sh zeigt jetzt die verbundenen Geräte mit Hersteller und Modell und bietet an, weiterzugehen, ein weiteres Gerät aufzunehmen oder eines zu trennen. provision.sh fragt bei mehreren, welches eingerichtet werden soll. Die Auswahl landet in ADB_SERIAL, und die adb-Hülle in lib.sh ergänzt -s selbsttätig — aber nur bei Unterbefehlen, die sich an ein Gerät richten. 'adb -s X devices' oder 'adb -s X connect' wären Unsinn und würden fehlschlagen. Dazu eine Korrektur, die beim Hinzufügen sonst falsch angeschlagen hätte: nach dem Koppeln reicht 'irgendein Gerät verbunden' als Erfolgsnachweis nicht, denn das erste Telefon ist ja noch da. Gezählt wird jetzt, ob eines DAZUGEKOMMEN ist. Co-Authored-By: Claude Opus 5 (1M context) --- provision/adb-wireless.sh | 52 +++++++++++++++++++++++++++----- provision/lib.sh | 63 ++++++++++++++++++++++++++++++++++++++- provision/provision.sh | 13 +++++--- 3 files changed, 115 insertions(+), 13 deletions(-) diff --git a/provision/adb-wireless.sh b/provision/adb-wireless.sh index abfb91a..adc1c7f 100755 --- a/provision/adb-wireless.sh +++ b/provision/adb-wireless.sh @@ -45,6 +45,13 @@ adb start-server >/dev/null 2>&1 # ── Hilfsmittel ────────────────────────────────────────────────────────────── ist_verbunden() { adb devices | grep -qw 'device$'; } +anzahl_geraete() { adb_geraete | wc -l | tr -d ' '; } + +# Nach dem Koppeln reicht "irgendein Gerät verbunden" als Erfolgsnachweis nicht: +# beim Hinzufügen eines zweiten Telefons wäre das erste ja noch da. Es zählt nur, +# ob EIN GERÄT DAZUGEKOMMEN ist. +GERAETE_VORHER=0 +neues_geraet() { [ "$(anzahl_geraete)" -gt "$GERAETE_VORHER" ]; } # Sucht einen mDNS-Dienst und gibt HOST:PORT zurück. Der Kopplungsdienst wird nur # angekündigt, solange der Kopplungsdialog auf dem Telefon offen ist — deshalb wird @@ -148,18 +155,47 @@ WO_VERBINDUNG="Auf dem Telefon: Drahtloses Debugging → 'IP-Adresse und Port' ( WO_KOPPLUNG="Auf dem Telefon: im Fenster 'Mit Kopplungscode koppeln' (ANDERER Port!)" # ── Schon verbunden? ───────────────────────────────────────────────────────── +# Ein bereits verbundenes Gerät darf kein Grund sein auszusteigen: ein zweites +# Telefon dazuzunehmen ist ein völlig normaler Wunsch, etwa beim Gerätewechsel, +# wenn altes und neues Gerät gleichzeitig erreichbar sein müssen. kopf "Aktueller Stand" if ist_verbunden; then - ok "Es ist bereits ein Gerät verbunden." - weiter_mit_provision - exit 0 + ok "Verbundene Geräte:" + while IFS= read -r S; do + [ -n "$S" ] && printf ' %-24s %s\n' "$S" "$(geraet_beschreiben "$S")" + done < <(adb_geraete) + cat <<'TEXT' + + Was möchtest du tun? + + [w] weiter zur Einrichtung (provision.sh übernimmt die Auswahl) + [n] ein weiteres Gerät hinzufügen (Kopplung oder Verbindung) + [t] ein verbundenes Gerät trennen + [a] abbrechen +TEXT + printf '\n Auswahl [w] > ' + read -r AKTION ' + read -r TRENNEN ' +printf '\n Wurde DIESES Telefon hier schon einmal gekoppelt? [j/N] > ' read -r SCHON_GEKOPPELT /dev/null | tr -d '\r') + modell=$("$ADB_BIN" -s "$serial" shell getprop ro.product.model 2>/dev/null | tr -d '\r') + printf '%s %s' "${hersteller:-?}" "${modell:-?}" +} + +# Wählt ein Gerät aus und setzt ADB_SERIAL. +# 0 = ein Gerät ausgewählt +# 1 = gar kein Gerät verbunden +geraet_waehlen() { + local liste=() zeile i wahl + while IFS= read -r zeile; do + [ -n "$zeile" ] && liste+=("$zeile") + done < <(adb_geraete) + + case ${#liste[@]} in + 0) ADB_SERIAL=""; return 1 ;; + 1) ADB_SERIAL="${liste[0]}"; return 0 ;; + esac + + kopf "Mehrere Geräte verbunden" + for i in "${!liste[@]}"; do + printf ' [%d] %-24s %s\n' "$((i + 1))" "${liste[i]}" "$(geraet_beschreiben "${liste[i]}")" + done + printf '\n Welches Gerät soll eingerichtet werden? [1] > ' + read -r wahl /dev/null && [ "$wahl" -le ${#liste[@]} ]; then + ADB_SERIAL="${liste[$((wahl - 1))]}" + ok "Gewählt: $ADB_SERIAL ($(geraet_beschreiben "$ADB_SERIAL"))" + return 0 + fi + warn "Ungültige Auswahl — nehme das erste Gerät." + ADB_SERIAL="${liste[0]}" + return 0 +} diff --git a/provision/provision.sh b/provision/provision.sh index 16b0b18..08720e1 100755 --- a/provision/provision.sh +++ b/provision/provision.sh @@ -112,10 +112,14 @@ TEXT exit 1 fi ok "Gerät verbunden" -elif [ "$ANZAHL" -gt 1 ]; then - fehl "Mehrere Geräte verbunden — bitte nur eines aktiv lassen." - adb devices | sed 's/^/ /' - hinweis "Überzählige trennen, per WLAN verbundene mit: adb disconnect " +fi + +# Mehrere Geräte sind kein Fehler, sondern der Normalfall beim Gerätewechsel: +# altes und neues Telefon müssen gleichzeitig erreichbar sein. Statt abzubrechen +# wird gefragt — und die Auswahl gilt danach für ALLE folgenden Befehle, weil die +# adb-Hülle in lib.sh selbsttätig -s ergänzt. +if ! geraet_waehlen; then + fehl "Es ist kein Gerät verbunden." exit 1 fi @@ -123,6 +127,7 @@ for p in ro.product.manufacturer ro.product.model ro.product.device \ ro.build.version.release ro.board.platform; do printf ' %-28s %s\n' "$p" "$(adb shell getprop "$p" 2>/dev/null | tr -d '\r')" done +hinweis "Ziel: ${ADB_SERIAL:-(einziges Gerät)}" [ "$TROCKEN" = 1 ] && warn "Trockenlauf — es wird nichts verändert." # ── Termux vorhanden? ────────────────────────────────────────────────────────