Entwicklerzugang: SSH nach Termux, sshfs, scrcpy

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) <noreply@anthropic.com>
This commit is contained in:
Stefan
2026-08-10 21:09:41 +02:00
co-authored by Claude Opus 5
parent 2d3c2fbc6d
commit 14f054c8e3
4 changed files with 220 additions and 0 deletions
+2
View File
@@ -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
+90
View File
@@ -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 <benutzer>@<telefon-ip>
```
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 <benutzer>@<ip>:/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.
+26
View File
@@ -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/tty || SCHLUESSEL=n
case "${SCHLUESSEL:-j}" in
j|J|"")
if adb push "$PUBKEY" /sdcard/hpos-id.pub >/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 <<TEXT
Nächste Schritte auf dem Telefon, in Termux:
+102
View File
@@ -0,0 +1,102 @@
#!/data/data/com.termux/files/usr/bin/bash
# HPOS — SSH-Zugang zu Termux einrichten. Reines Entwicklerwerkzeug.
#
# Für die Arbeit am Projekt ist ein SSH-Zugang deutlich angenehmer als die
# Bildschirmtastatur: echte Tastatur, Zwischenablage, Verlauf, und über sshfs
# lassen sich die Dateien auf dem Telefon direkt im Editor des Rechners öffnen.
#
# Termux' sshd lauscht auf Port 8022, nicht 22 — Ports unter 1024 darf eine
# gewöhnliche App nicht belegen.
#
# Aufruf in Termux: bash ~/hpos/tools/dev-ssh.sh
set -uo pipefail
SCHLUESSEL_ABLAGE="/sdcard/hpos-id.pub"
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"; }
case "${PREFIX:-}" in
*com.termux*) : ;;
*) fehl "Dieses Skript läuft in Termux auf dem Telefon."; exit 1 ;;
esac
kopf "OpenSSH"
if command -v sshd >/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 <<TEXT
Vom Rechner aus:
ssh -p 8022 ${BENUTZER}@${IP:-<telefon-ip>}
Dateien im Editor des Rechners bearbeiten:
mkdir -p ~/telefon
sshfs -p 8022 ${BENUTZER}@${IP:-<telefon-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