Files
linux-on-android-without-root/provision/adb-wireless.sh
T
StefanandClaude Opus 5 410cf01973 adb gezielt auswählen statt der PATH-Reihenfolge zu vertrauen
Debians Paket android-tools-adb liefert Version 29 und kennt kein 'adb pair' —
das kam erst mit platform-tools 30. Wer beides installiert hat, bekommt je nach
PATH-Reihenfolge und Alter der Terminalsitzung mal das eine und mal das andere,
und die WLAN-Kopplung scheitert scheinbar grundlos.

provision/lib.sh sucht deshalb gezielt eine Fassung, die 'pair' beherrscht, und
schiebt eine Shell-Funktion 'adb' davor, sodass die Aufrufstellen unverändert
bleiben. Eine ausdrücklich gesetzte Vorgabe ADB= gilt absolut, auch wenn sie
kein pair kann — stillschweigend etwas anderes zu nehmen wäre die unangenehmere
Überraschung. Fehlt pair, läuft provision.sh mit einer Warnung weiter (für USB
reicht es), adb-wireless.sh bricht sauber ab.

Die Prüfung kommt bewusst ohne Pipe aus: 'adb pair' ohne Argumente endet mit
Code 1, weil es ein Aufruffehler ist. Unter 'set -o pipefail' hätte das die
gesamte Pipeline als fehlgeschlagen gelten lassen, obwohl grep den Hilfetext
gefunden hatte — die Erkennung meldete dadurch selbst adb 36 als zu alt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-09 17:53:41 +02:00

143 lines
5.9 KiB
Bash
Executable File

#!/usr/bin/env bash
# HPOS — ADB über WLAN verbinden, ohne USB-Kabel.
#
# Android 11 und neuer bringen "Wireless Debugging" mit: einmal per sechsstelligem
# Code koppeln, danach verbindet sich adb über das Netz. Ein Kabel wird nie gebraucht.
#
# Die Ports vergibt Android bei jedem Einschalten neu — deshalb werden sie hier per
# mDNS gesucht statt abgetippt. Wichtig: Kopplungs- und Verbindungsport sind zwei
# verschiedene Dinge, das ist die häufigste Verwechslung.
#
# Aufruf: ./provision/adb-wireless.sh
set -uo pipefail
source "$(dirname "$0")/lib.sh"
kopf "Werkzeug"
if adb_einrichten; then
ok "adb $(adb_version "$ADB_BIN") — kann WLAN-Kopplung"
hinweis "$ADB_BIN"
else
fehl "Ohne 'adb pair' ist eine Kopplung über WLAN nicht möglich."
hinweis "Entweder aktuelle platform-tools installieren, oder doch ein Kabel besorgen."
exit 1
fi
adb start-server >/dev/null 2>&1
# 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
# wiederholt gesucht statt einmal.
suche_dienst() {
local typ="$1" versuche="${2:-20}" i zeile
for ((i = 1; i <= versuche; i++)); do
zeile=$(adb mdns services 2>/dev/null | awk -v t="$typ" '$2 == t {print $3; exit}')
if [ -n "$zeile" ]; then printf '%s' "$zeile"; return 0; fi
printf '.' >&2
sleep 1
done
return 1
}
# ── Schon verbunden? ─────────────────────────────────────────────────────────
kopf "Aktueller Stand"
VERBUNDEN=$(adb devices | grep -w 'device$' | wc -l)
if [ "$VERBUNDEN" -gt 0 ]; then
adb devices | grep -w 'device$' | sed 's/^/ /'
ok "Es ist bereits ein Gerät verbunden."
hinweis "Weiter mit: ./provision/provision.sh"
exit 0
fi
hinweis "Kein Gerät verbunden — Kopplung wird eingerichtet."
# ── Anleitung ────────────────────────────────────────────────────────────────
kopf "Auf dem Telefon"
cat <<'TEXT'
1. Sicherstellen, dass Telefon und dieser Rechner im SELBEN WLAN sind.
Ein Gäste-WLAN oder eine aktive Client-Isolierung verhindert die Verbindung.
2. Einstellungen → System → Entwickleroptionen → "Drahtloses Debugging" EIN
3. Dort auf "Gerät mit Kopplungscode koppeln" tippen.
Es erscheint ein sechsstelliger Code und eine Adresse.
Dieses Fenster BITTE OFFEN LASSEN, bis die Kopplung durch ist —
der Kopplungsdienst verschwindet sonst sofort wieder.
TEXT
printf '\n Wenn das Fenster mit dem Code offen ist, hier Enter drücken > '
read -r _ </dev/tty
# ── Kopplung ─────────────────────────────────────────────────────────────────
kopf "Kopplungsdienst suchen"
printf ' Suche per mDNS '
if PAIR_ZIEL=$(suche_dienst _adb-tls-pairing._tcp 25); then
printf '\n'; ok "gefunden: $PAIR_ZIEL"
else
printf '\n'; warn "Nichts per mDNS gefunden."
hinweis "Manche Netze blockieren Multicast, dann klappt die automatische Suche nicht."
printf ' Adresse aus dem Kopplungsfenster eintippen (IP:PORT) > '
read -r PAIR_ZIEL </dev/tty
[ -n "$PAIR_ZIEL" ] || { fehl "Ohne Adresse geht es nicht."; exit 1; }
fi
printf ' Sechsstelligen Kopplungscode eingeben > '
read -r CODE </dev/tty
kopf "Koppeln"
if adb pair "$PAIR_ZIEL" "$CODE"; then
ok "Kopplung erfolgreich"
else
fehl "Kopplung fehlgeschlagen."
hinweis "Häufigste Ursachen: Code abgelaufen (er gilt nur kurz),"
hinweis "Fenster zu früh geschlossen, oder Telefon in einem anderen Netz."
exit 1
fi
# ── Verbinden ────────────────────────────────────────────────────────────────
# Der Verbindungsport ist ein ANDERER als der Kopplungsport. Er steht auf der
# Hauptseite von "Drahtloses Debugging" unter "IP-Adresse und Port".
kopf "Verbinden"
hinweis "Das Kopplungsfenster kann jetzt geschlossen werden."
printf ' Suche Verbindungsdienst '
if CONNECT_ZIEL=$(suche_dienst _adb-tls-connect._tcp 20); then
printf '\n'; ok "gefunden: $CONNECT_ZIEL"
else
printf '\n'; warn "Nichts per mDNS gefunden."
hinweis "Adresse steht auf der Hauptseite von 'Drahtloses Debugging'."
printf ' Adresse eintippen (IP:PORT) > '
read -r CONNECT_ZIEL </dev/tty
[ -n "$CONNECT_ZIEL" ] || { fehl "Ohne Adresse geht es nicht."; exit 1; }
fi
if adb connect "$CONNECT_ZIEL"; then
sleep 2
if adb devices | grep -qw 'device$'; then
ok "Verbunden"
adb devices | grep -w 'device$' | sed 's/^/ /'
else
fehl "Verbindung kam nicht zustande."
adb devices | sed 's/^/ /'
hinweis "Steht dort 'unauthorized', den Dialog auf dem Telefon bestätigen."
exit 1
fi
else
fehl "adb connect fehlgeschlagen."
exit 1
fi
# ── Weiter ───────────────────────────────────────────────────────────────────
kopf "Fertig"
cat <<TEXT
Jetzt läuft die Einrichtung wie mit Kabel:
./provision/provision.sh
Gut zu wissen für später:
· Die Kopplung bleibt bestehen. Nach einem Neustart des Telefons oder
nach dem Aus- und Einschalten von "Drahtloses Debugging" ändert sich
aber der Port — dann genügt dieses Skript erneut, ohne neuen Code.
· ADB wird in diesem Projekt nur für die Ersteinrichtung gebraucht.
Im Dauerbetrieb kommt HPOS ohne Privilegienkanal aus.
· Trennen mit: adb disconnect
TEXT