From 14f054c8e30d64b0356cffe2ba0aa6ce37798cf1 Mon Sep 17 00:00:00 2001 From: Stefan Date: Mon, 10 Aug 2026 21:09:41 +0200 Subject: [PATCH] Entwicklerzugang: SSH nach Termux, sshfs, scrcpy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Auf der Bildschirmtastatur eines Telefons lässt sich nicht arbeiten. Zwei Wege, die sich ergänzen: SSH für alles Textliche, scrcpy für alles, was man sehen muss — Beweis S1 zeigt sich nur auf dem Bildschirm, die Kamera in S3 prüft man im Browser. tools/dev-ssh.sh richtet Termux' sshd ein (Port 8022, weil eine gewöhnliche App keine Ports unter 1024 belegen darf). Schlüssel vor Passwort: ein Passwort auf der Bildschirmtastatur einzutippen ist mühsam, und wer es sich deshalb kurz wählt, hat einen offenen Dienst im WLAN. provision.sh legt den öffentlichen Schlüssel des Rechners deshalb gleich mit ab. Über sshfs lassen sich die Dateien des Telefons im Editor des Rechners öffnen — kein Hin- und Herkopieren mehr. docs/entwicklung.md beschreibt beides samt Richtung der Änderungen: entwickelt wird auf dem Rechner, das Telefon führt nur aus und holt per git pull. Genau deshalb kommt per adb auch nur das Startskript aufs Gerät. Co-Authored-By: Claude Opus 5 (1M context) --- README.md | 2 + docs/entwicklung.md | 90 ++++++++++++++++++++++++++++++++++++ provision/provision.sh | 26 +++++++++++ tools/dev-ssh.sh | 102 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 220 insertions(+) create mode 100644 docs/entwicklung.md create mode 100755 tools/dev-ssh.sh diff --git a/README.md b/README.md index ee15fcc..5beb4aa 100644 --- a/README.md +++ b/README.md @@ -102,6 +102,8 @@ und „war morgens weg". - [Verworfene Entscheidungen](docs/verworfene-entscheidungen.md) — sieben Wege, die geprüft und begründet verworfen wurden. **Vor jedem "warum eigentlich nicht …" lesen.** - [Spike-Protokoll](docs/spike-protokoll.md) — Messergebnisse von Phase 0 +- [Am Projekt arbeiten](docs/entwicklung.md) — SSH nach Termux, scrcpy, sshfs. + **Nicht auf der Bildschirmtastatur entwickeln.** ## Geräte diff --git a/docs/entwicklung.md b/docs/entwicklung.md new file mode 100644 index 0000000..14903da --- /dev/null +++ b/docs/entwicklung.md @@ -0,0 +1,90 @@ +# Am Projekt arbeiten + +Die Bildschirmtastatur eines Telefons ist zum Entwickeln unbrauchbar. Zwei Werkzeuge +lösen das, und sie ergänzen sich: **SSH** für alles Textliche, **scrcpy** für alles, +was man sehen muss. + +## SSH nach Termux — für Terminalarbeit + +Der wichtigere der beiden Wege. Echte Tastatur, Zwischenablage, Verlauf, Rollbalken. + +```bash +# Einmalig auf dem PC (provision.sh bietet es von selbst an) +adb push ~/.ssh/id_ed25519.pub /sdcard/hpos-id.pub + +# Auf dem Telefon +bash ~/hpos/tools/dev-ssh.sh + +# Danach vom PC +ssh -p 8022 @ +``` + +Port 8022 statt 22, weil eine gewöhnliche App keine Ports unter 1024 belegen darf. + +**Dateien im Editor des Rechners bearbeiten** — kein Hin- und Herkopieren: + +```bash +mkdir -p ~/telefon +sshfs -p 8022 @:/data/data/com.termux/files/home ~/telefon +# lösen mit: fusermount3 -u ~/telefon +``` + +`sshd` überlebt keinen Neustart von Termux. Danach genügt `sshd` in Termux. +In fremden Netzen abschalten: `pkill sshd` — der Dienst ist im ganzen WLAN erreichbar. + +## scrcpy — Bildschirm und Zwischenablage + +Für alles Grafische unverzichtbar: Beweis S1 zeigt sich nur auf dem Bildschirm, und +die Kamera in S3 prüft man in einem Browserfenster. + +```bash +sudo apt install scrcpy # Debian/Ubuntu +scrcpy # nutzt die bestehende adb-Verbindung, auch über WLAN +``` + +Was es mitbringt, ohne weitere Einrichtung: + +- **Zwischenablage in beide Richtungen.** Auf dem Telefon kopieren, auf dem PC + einfügen und umgekehrt. +- **Tastatur und Maus des Rechners** wirken direkt im Telefon — auch in Termux. +- Läuft über dieselbe WLAN-Verbindung, die schon steht. + +Nützliche Schalter: + +| Schalter | Wofür | +|---|---| +| `--max-size 1024` | weniger Bandbreite, flüssiger über WLAN | +| `--stay-awake` | Bildschirm bleibt an, solange gespiegelt wird | +| `--turn-screen-off` | Telefonbildschirm aus, spart Akku beim langen Arbeiten | +| `--no-audio` | falls die Tonübertragung stört | + +`scrcpy --new-display` kann eine App in ein eigenes virtuelles Display legen. Als +Entwicklerwerkzeug ist das nützlich — als Produktbestandteil wurde es +[verworfen](verworfene-entscheidungen.md#v6--host-apps-als-fenster-im-linux-desktop), +weil es dauerhaft Shell-Rechte bräuchte. + +## Der Weg der Änderungen + +``` +PC (Arbeitskopie) --git push--> Forge --git pull--> Telefon (~/hpos) +``` + +Auf dem Telefon wird nicht entwickelt, dort wird ausgeführt. Änderungen entstehen auf +dem Rechner, werden gepusht und mit `cd ~/hpos && git pull` geholt. Deshalb kommt per +adb auch nur das Startskript aufs Gerät und nicht das Repo — sonst wäre es eine Kopie +statt einer Arbeitskopie. + +Ergebnisse laufen in die Gegenrichtung: `spike/out/` bleibt lokal auf dem Telefon +(bewusst nicht im Repo), die Auswertung wandert von Hand nach +[`spike-protokoll.md`](spike-protokoll.md). + +## Kleinigkeiten, die Zeit sparen + +- **Protokolle direkt vom Telefon holen**, ohne SSH: + `adb shell run-as com.termux cat …` scheitert meist an fehlender Debuggability. + Einfacher ist der Umweg über die gemeinsame Ablage: + `cp ~/hpos/spike/out/*.log /sdcard/` und dann `adb pull /sdcard/…` +- **Termux offen halten**: Ein Wisch aus den zuletzt verwendeten Apps beendet den + gesamten Stack. Im Task-Manager anpinnen. +- **Mehrere Sitzungen** in Termux mit `Ctrl+Alt+C` — praktisch, um neben einem + laufenden Desktop noch ein Terminal zu haben. diff --git a/provision/provision.sh b/provision/provision.sh index 87f6fe1..1d50ba0 100755 --- a/provision/provision.sh +++ b/provision/provision.sh @@ -317,6 +317,32 @@ else esac fi +# ── Entwicklerzugang ───────────────────────────────────────────────────────── +# Öffentlichen Schlüssel gleich mitschicken, damit später kein Passwort auf der +# Bildschirmtastatur eingetippt werden muss. +if [ "$TROCKEN" != 1 ]; then + PUBKEY="" + for k in ~/.ssh/id_ed25519.pub ~/.ssh/id_rsa.pub; do + [ -r "$k" ] && { PUBKEY="$k"; break; } + done + if [ -n "$PUBKEY" ]; then + kopf "Entwicklerzugang" + hinweis "Für SSH nach Termux — echte Tastatur statt Bildschirmtastatur." + printf ' Öffentlichen Schlüssel (%s) aufs Telefon legen? [J/n] > ' "$(basename "$PUBKEY")" + read -r SCHLUESSEL /dev/null 2>&1; then + ok "Schlüssel abgelegt unter /sdcard/hpos-id.pub" + hinweis "Auf dem Telefon einrichten: bash ~/hpos/tools/dev-ssh.sh" + else + warn "Übertragung fehlgeschlagen" + fi + ;; + esac + fi +fi + kopf "Fertig" cat </dev/null 2>&1; then + ok "bereits installiert" +else + pkg install -y openssh || { fehl "Installation fehlgeschlagen"; exit 1; } + ok "installiert" +fi + +# ── Anmeldung ──────────────────────────────────────────────────────────────── +# Schlüssel vor Passwort: ein Passwort auf der Bildschirmtastatur einzutippen ist +# mühsam, und wer es sich deshalb kurz wählt, hat einen offenen Dienst im WLAN. +kopf "Anmeldung" +mkdir -p "$HOME/.ssh" && chmod 700 "$HOME/.ssh" + +if [ -r "$SCHLUESSEL_ABLAGE" ]; then + if grep -qxFf "$SCHLUESSEL_ABLAGE" "$HOME/.ssh/authorized_keys" 2>/dev/null; then + ok "Öffentlicher Schlüssel bereits hinterlegt" + else + cat "$SCHLUESSEL_ABLAGE" >>"$HOME/.ssh/authorized_keys" + chmod 600 "$HOME/.ssh/authorized_keys" + ok "Öffentlichen Schlüssel aus $SCHLUESSEL_ABLAGE übernommen" + fi +elif [ -s "$HOME/.ssh/authorized_keys" ]; then + ok "authorized_keys vorhanden" +else + warn "Kein öffentlicher Schlüssel gefunden." + hinweis "Bequemer Weg — auf dem RECHNER ausführen:" + hinweis " adb push ~/.ssh/id_ed25519.pub $SCHLUESSEL_ABLAGE" + hinweis " (oder ~/.ssh/id_rsa.pub) und dieses Skript erneut aufrufen." + echo + printf ' Stattdessen jetzt ein Passwort setzen? [j/N] > ' + read -r MIT_PASSWORT + case "${MIT_PASSWORT:-n}" in + j|J) passwd || { fehl "Passwort nicht gesetzt"; exit 1; } ;; + *) fehl "Ohne Schlüssel oder Passwort ist keine Anmeldung möglich."; exit 1 ;; + esac +fi + +# ── Dienst ─────────────────────────────────────────────────────────────────── +kopf "sshd" +pkill sshd 2>/dev/null && hinweis "alte Instanz beendet" +sleep 1 +if sshd; then ok "läuft auf Port 8022"; else fehl "Start fehlgeschlagen"; exit 1; fi + +# ── Adresse ────────────────────────────────────────────────────────────────── +kopf "Verbinden" +IP=$(ip -4 addr show 2>/dev/null | awk '/inet .*(wlan|swlan)/ {print $2}' | cut -d/ -f1 | head -1) +[ -z "$IP" ] && IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}') +BENUTZER=$(whoami) + +cat <} + + Dateien im Editor des Rechners bearbeiten: + + mkdir -p ~/telefon + sshfs -p 8022 ${BENUTZER}@${IP:-}:/data/data/com.termux/files/home ~/telefon + # lösen mit: fusermount3 -u ~/telefon + + Gut zu wissen: + + · sshd überlebt keinen Neustart von Termux — dann dieses Skript erneut, + oder schlicht 'sshd' aufrufen. + · Port 8022 statt 22, weil eine gewöhnliche App keine Ports unter 1024 + belegen darf. + · Der Dienst ist im ganzen WLAN erreichbar. In fremden Netzen abschalten: + pkill sshd +TEXT