Mehrere Geräte gleichzeitig unterstützen

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) <noreply@anthropic.com>
This commit is contained in:
Stefan
2026-08-09 18:12:57 +02:00
co-authored by Claude Opus 5
parent f30b32aaa8
commit 915fe53eeb
3 changed files with 115 additions and 13 deletions
+44 -8
View File
@@ -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 </dev/tty || AKTION=w
case "${AKTION:-w}" in
n|N) hinweis "Gut — weiter mit dem neuen Gerät." ;;
t|T)
printf ' Welche Adresse trennen? (leer = alle) > '
read -r TRENNEN </dev/tty || TRENNEN=""
if [ -n "$TRENNEN" ]; then adb disconnect "$TRENNEN"; else adb disconnect; fi
ok "Getrennt."
exit 0
;;
a|A) hinweis "Abgebrochen."; exit 0 ;;
*) weiter_mit_provision; exit 0 ;;
esac
fi
# Stand festhalten, BEVOR etwas dazukommt — daran wird der Erfolg gemessen.
GERAETE_VORHER=$(anzahl_geraete)
# ── Erst verbinden, dann erst koppeln ────────────────────────────────────────
# Wer schon einmal gekoppelt hat, braucht keinen neuen Code, sondern nur ein neues
# connect. Ohne diesen Schritt landet man bei jedem Aufruf wieder im Kopplungsdialog.
hinweis "Kein Gerät verbunden."
printf '\n Wurde dieses Telefon hier schon einmal gekoppelt? [j/N] > '
printf '\n Wurde DIESES Telefon hier schon einmal gekoppelt? [j/N] > '
read -r SCHON_GEKOPPELT </dev/tty || SCHON_GEKOPPELT=n
case "${SCHON_GEKOPPELT:-n}" in
@@ -169,7 +205,7 @@ case "${SCHON_GEKOPPELT:-n}" in
if ZIEL=$(adresse_holen _adb-tls-connect._tcp "$WO_VERBINDUNG" 15); then
adb connect "$ZIEL"
sleep 2
if ist_verbunden; then
if neues_geraet; then
ok "Verbunden"
weiter_mit_provision
exit 0
@@ -226,7 +262,7 @@ hinweis "Das Kopplungsfenster kann jetzt geschlossen werden."
# Neuere adb-Fassungen verbinden nach dem Koppeln von selbst über mDNS.
sleep 3
if ist_verbunden; then
if neues_geraet; then
ok "Verbindung stand bereits nach dem Koppeln"
weiter_mit_provision
exit 0
@@ -240,7 +276,7 @@ fi
adb connect "$ZIEL"
sleep 2
if ist_verbunden; then
if neues_geraet; then
ok "Verbunden"
weiter_mit_provision
exit 0
+62 -1
View File
@@ -99,6 +99,67 @@ adb_einrichten() {
;;
esac
# Ab hier zeigt 'adb' immer auf die ausgewählte Fassung, unabhängig von PATH.
adb() { "$ADB_BIN" "$@"; }
#
# Ist ein Gerät ausgewählt (ADB_SERIAL), wird -s ergänzt — aber nur bei
# Unterbefehlen, die sich an ein bestimmtes Gerät richten. 'adb -s X connect'
# oder 'adb -s X devices' wären Unsinn und würden fehlschlagen.
adb() {
case "${1:-}" in
shell|push|pull|install|install-multiple|uninstall|forward|reverse| \
logcat|sync|reboot|remount|root|unroot|bugreport|wait-for-device)
if [ -n "${ADB_SERIAL:-}" ]; then
"$ADB_BIN" -s "$ADB_SERIAL" "$@"
return
fi
;;
esac
"$ADB_BIN" "$@"
}
return $rc
}
# ── Geräteauswahl ────────────────────────────────────────────────────────────
# Mehrere Geräte gleichzeitig sind der Normalfall, sobald man ein zweites Telefon
# koppelt oder nebenher noch eines am Kabel hängt. Statt abzubrechen wird gefragt.
ADB_SERIAL="${ADB_SERIAL:-}"
adb_geraete() { adb devices | awk '$2 == "device" { print $1 }'; }
geraet_beschreiben() {
local serial="$1" hersteller modell
hersteller=$("$ADB_BIN" -s "$serial" shell getprop ro.product.manufacturer 2>/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/tty || wahl=1
wahl="${wahl:-1}"
if [ "$wahl" -ge 1 ] 2>/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
}
+9 -4
View File
@@ -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 <ip:port>"
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? ────────────────────────────────────────────────────────