diff --git a/README.md b/README.md index 35dfe07..a0d0bef 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,36 @@ # Upterm – Terminal Session Sharing +Upterm ermöglicht das einfache Teilen von SSH-Sessions. Ideal für Kunden-Support oder Pair-Programming mit externen Personen ohne Teleport-Zugang. Clients benötigen nur einen SSH-Client – keine zusätzliche Software nötig. + --- ## ⚡ Schnellstart – Session teilen -> Voraussetzung: upterm installiert (siehe unten). Server läuft auf `upterm.ebesch.de`. +> Voraussetzung: upterm installiert (siehe [Client Installation](#client-installation)). -### Linux / macOS +### Linux ```bash upterm host --server ssh://upterm.ebesch.de:2222 --accept -- bash ``` -Per Alias (in `~/.bashrc` / `~/.zshrc`): +Per Alias (in `~/.bashrc`): ```bash alias share='upterm host --server ssh://upterm.ebesch.de:2222 --accept -- bash' +share ``` +### macOS + ```bash +upterm host --server ssh://upterm.ebesch.de:2222 --accept -- bash +``` + +Per Alias (in `~/.zshrc`): + +```bash +alias share='upterm host --server ssh://upterm.ebesch.de:2222 --accept -- bash' share ``` @@ -46,10 +58,94 @@ ssh TOKEN:HASH@upterm.ebesch.de -p 2222 --- +## Client Installation -Upterm ermöglicht das einfache Teilen von SSH-Sessions. Ideal für Kunden-Support oder Pair-Programming mit externen Personen ohne Teleport-Zugang. Clients benötigen nur einen SSH-Client – keine zusätzliche Software nötig. +### macOS -## Architektur +Installation via [Homebrew](https://brew.sh): + +```bash +brew install owenthereal/upterm/upterm +``` + +### Linux (Debian / Ubuntu) + +Installation via `.deb`-Paket aus den GitHub Releases: + +```bash +curl -sL https://github.com/owenthereal/upterm/releases/latest/download/upterm_linux_amd64.deb -o /tmp/upterm.deb +sudo dpkg -i /tmp/upterm.deb +``` + +ARM64 (z. B. Raspberry Pi): + +```bash +curl -sL https://github.com/owenthereal/upterm/releases/latest/download/upterm_linux_arm64.deb -o /tmp/upterm.deb +sudo dpkg -i /tmp/upterm.deb +``` + +### Windows + +Installation via [Scoop](https://scoop.sh): + +**1. Berechtigungen – Execution Policy setzen** (einmalig, PowerShell als Administrator): + +```powershell +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +``` + +**2. Scoop installieren:** + +```powershell +Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression +``` + +> Scoop installiert sich benutzerspezifisch nach `%USERPROFILE%\scoop\`. +> PowerShell nach der Installation neu starten, damit der PATH wirksam wird. + +**3. upterm installieren:** + +```powershell +scoop bucket add upterm https://github.com/owenthereal/scoop-upterm +scoop install upterm +``` + +#### Bekanntes Problem: 7zip Exit code 1640 + +Scoop benötigt `7zip` als Abhängigkeit. Auf manchen Systemen schlägt die MSI-Extraktion fehl: + +``` +ERROR Exit code was 1640! +Failed to extract files from ...\7z2601-x64.msi. +``` + +Ursache: UAC/Sitzungskonflikt bei MSI-Paketen. Workaround mit `lessmsi`: + +```powershell +scoop uninstall 7zip +scoop cache rm 7zip +Remove-Item -Recurse -Force "$env:USERPROFILE\scoop\apps\7zip" -ErrorAction SilentlyContinue + +scoop config use_lessmsi true +scoop install 7zip +``` + +Danach `scoop install upterm` erneut ausführen. + +#### Troubleshooting Windows + +| Problem | Ursache | Lösung | +|---------|---------|--------| +| `Skriptausführung deaktiviert` | Execution Policy zu restriktiv | `Set-ExecutionPolicy RemoteSigned -Scope CurrentUser` | +| 7zip Exit code 1640 | MSI-Sitzungskonflikt (UAC) | `scoop config use_lessmsi true`, dann 7zip neu | +| Host-Key Warnung | Erster Verbindungsaufbau | Einmalig `yes` – Fingerprint: `SHA256:nOHK++kJYUJz1bqUY1AM6defn36vTXsgWuSEhr3ltLk` | +| `upterm` nicht gefunden | PATH noch nicht aktiv | PowerShell neu starten | + +--- + +## Details & Server-Setup + +### Architektur ``` [Host-Maschine] @@ -71,9 +167,9 @@ ssh -p 2222 ... upterm proxy wss://... --- -## Installation & Build +### Server: Installation & Build -### Go installieren +#### Go installieren ```bash curl -sL https://go.dev/dl/go1.22.4.linux-amd64.tar.gz -o /tmp/go.tar.gz @@ -84,7 +180,7 @@ source ~/.bashrc go version ``` -### upterm & uptermd aus Source bauen +#### upterm & uptermd aus Source bauen ```bash git clone https://github.com/owenthereal/upterm.git @@ -93,21 +189,20 @@ go build -o /usr/local/bin/uptermd ./cmd/uptermd/ go build -o /usr/local/bin/upterm ./cmd/upterm/ ``` -### Host-Keys generieren +#### Host-Keys generieren ```bash mkdir -p /etc/uptermd/keys ssh-keygen -t ed25519 -f /etc/uptermd/keys/ed25519 -N "" ssh-keygen -t rsa -b 4096 -f /etc/uptermd/keys/rsa -N "" -# Berechtigungen für nobody chown -R nobody:nogroup /etc/uptermd/keys chmod 600 /etc/uptermd/keys/* ``` --- -## systemd Service +### Server: systemd Service Siehe [`uptermd.service`](uptermd.service). @@ -121,11 +216,9 @@ systemctl status uptermd --- -## Erreichbarkeit +### Server: Erreichbarkeit -### Primär: Port 2222 via Portweiterleitung im Router - -Einfachste Lösung – direkte TCP-Weiterleitung, kein Proxy nötig. +#### Primär: Port 2222 via Portweiterleitung im Router | Feld | Wert | |------|------| @@ -138,7 +231,7 @@ Einfachste Lösung – direkte TCP-Weiterleitung, kein Proxy nötig. ssh -p 2222 TOKEN:HASH@upterm.ebesch.de ``` -### Alternativ: WebSocket via Nginx Proxy Manager (Port 443) +#### Alternativ: WebSocket via Nginx Proxy Manager (Port 443) Für Clients hinter restriktiven Firewalls. Erfordert `upterm` CLI auf Client-Seite. @@ -151,7 +244,6 @@ Für Clients hinter restriktiven Firewalls. Erfordert `upterm` CLI auf Client-Se | SSL | ✅ Let's Encrypt | ```nginx -# NPM Advanced – falls WebSocket-Header fehlen proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; @@ -164,21 +256,9 @@ ssh -o ProxyCommand='upterm proxy wss://TOKEN@upterm.ebesch.de' \ --- -## Nutzung - -> **Wichtig:** Immer `--server` und `--accept` angeben. -> Ohne `--server` verbindet upterm mit dem öffentlichen uptermd.upterm.dev. -> Ohne `--accept` muss jede eingehende Verbindung manuell bestätigt werden. - -### Session starten +### Nutzung (erweitert) ```bash -# Standard – eigener Server, automatisch akzeptieren -upterm host --server ssh://upterm.ebesch.de:2222 --accept -- bash - -# Alternativ via WebSocket -upterm host --server wss://upterm.ebesch.de --accept -- bash - # tmux-Session teilen (empfohlen) upterm host --server ssh://upterm.ebesch.de:2222 --accept \ --force-command 'tmux attach -t shared' \ @@ -186,45 +266,23 @@ upterm host --server ssh://upterm.ebesch.de:2222 --accept \ # Read-only (Kunde kann nur zuschauen) upterm host --server ssh://upterm.ebesch.de:2222 --accept --read-only -- bash -``` -### Schnellstart per Alias - -```bash -# ~/.bashrc oder ~/.zshrc -alias share='upterm host --server ssh://upterm.ebesch.de:2222 --accept -- bash' -``` - -```bash -share -# Token erscheint sofort – kopieren und weitergeben -``` - -### Session-Info - -```bash +# Session-Info anzeigen upterm session current ``` -### Client verbinden - -```bash -# Ohne upterm CLI – nur SSH nötig (Port 2222) -ssh -p 2222 TOKEN:HASH@upterm.ebesch.de - -# Mit upterm CLI via WebSocket (Port 443) -ssh -o ProxyCommand='upterm proxy wss://TOKEN@upterm.ebesch.de' \ - TOKEN@upterm.ebesch.de:443 -``` - --- -## Client-Anforderungen +### Zusammenspiel mit Teleport -| Verbindungsweg | Client braucht | -|---|---| -| SSH Port 2222 (Portweiterleitung) | Nur `ssh` – nichts installieren | -| WebSocket WSS Port 443 | `upterm` CLI | +| | Teleport | Upterm | +|---|---|---| +| Zweck | Access-Management, Audit | Session-Sharing / Pairing | +| Zielgruppe | Internes Team | Externe ohne Teleport-Zugang | +| Persistent | Ja (systemd) | Nur während aktiver Session | +| Ports | 3022, 3080 | 2222, 8080 | + +> Faustregel: Teleport für das interne Team, Upterm für Kunden oder externe Kollegen die nur SSH benötigen. --- @@ -232,115 +290,3 @@ ssh -o ProxyCommand='upterm proxy wss://TOKEN@upterm.ebesch.de' \ - [GitHub – owenthereal/upterm](https://github.com/owenthereal/upterm) - [upterm.dev](https://upterm.dev) ---- - -## Windows Client - -### Voraussetzungen & Berechtigungen - -PowerShell muss Skripte aus dem Internet ausführen dürfen. Standard-Installation blockiert dies. - -**Execution Policy setzen** (einmalig, PowerShell als Administrator): - -```powershell -Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser -``` - -> **Hinweis:** Der Log zeigt die Installation unter dem `Administrator`-Konto (`C:\Users\Administrator>`). -> Scoop installiert sich dabei in `%USERPROFILE%\scoop\` – also benutzerspezifisch, nicht systemweit. -> Auf normalen Benutzerkonten ist das Vorgehen identisch. - ---- - -### Installation via Scoop - -**1. Scoop installieren:** - -```powershell -Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression -``` - -Scoop fügt `~\scoop\shims` automatisch zum PATH hinzu. -**PowerShell nach der Installation neu starten**, damit der PATH wirksam wird. - -**2. upterm-Bucket hinzufügen und upterm installieren:** - -```powershell -scoop bucket add upterm https://github.com/owenthereal/scoop-upterm -scoop install upterm -``` - ---- - -### Bekanntes Problem: 7zip Exit code 1640 - -Scoop installiert `7zip` als Abhängigkeit via MSI. Auf manchen Systemen schlägt die MSI-Extraktion fehl: - -``` -ERROR Exit code was 1640! -Failed to extract files from ...\7z2601-x64.msi. -``` - -Fehlercode 1640 bedeutet: Installation aus einer anderen Sitzungsebene heraus nicht erlaubt (UAC/Sitzungskonflikt bei MSI-Paketen). - -**Workaround – lessmsi als MSI-Extraktor verwenden:** - -```powershell -# Fehlgeschlagene Installation bereinigen -scoop uninstall 7zip -scoop cache rm 7zip -Remove-Item -Recurse -Force "$env:USERPROFILE\scoop\apps\7zip" -ErrorAction SilentlyContinue - -# lessmsi aktivieren (ersetzt den Windows Installer für MSI-Pakete) -scoop config use_lessmsi true - -# 7zip erneut installieren -scoop install 7zip -``` - -Danach läuft `scoop install upterm` ohne weitere Probleme durch. - ---- - -### Nutzung unter Windows - -**Session starten (PowerShell):** - -```powershell -upterm host --server ssh://upterm.ebesch.de:2222 --accept -``` - -Beim **ersten Verbinden** erscheint eine Host-Key-Warnung – einmalig mit `yes` bestätigen: - -``` -The authenticity of host '[upterm.ebesch.de]:2222 ...' can't be established. -ED25519 key fingerprint is SHA256:nOHK++kJYUJz1bqUY1AM6defn36vTXsgWuSEhr3ltLk. -Are you sure you want to continue connecting (yes/no/[fingerprint])? yes -``` - -Danach erscheint der Token sofort: - -``` -Session: MCZoCPoVAz5uTINZkdNN -➤ SSH: ssh TOKEN:HASH@upterm.ebesch.de -p 2222 -➤ SFTP: sftp -P 2222 TOKEN:HASH@upterm.ebesch.de -``` - -> Unter Windows startet upterm eine `powershell -NoLogo` Session statt `bash`. - -**Client verbindet sich (nur SSH nötig):** - -```powershell -ssh TOKEN:HASH@upterm.ebesch.de -p 2222 -``` - ---- - -### Troubleshooting - -| Problem | Ursache | Lösung | -|---------|---------|--------| -| `Skriptausführung deaktiviert` | Execution Policy zu restriktiv | `Set-ExecutionPolicy RemoteSigned -Scope CurrentUser` | -| 7zip Exit code 1640 | MSI-Sitzungskonflikt (UAC) | `scoop config use_lessmsi true`, dann 7zip neu installieren | -| Host-Key Warnung | Erster Verbindungsaufbau | Einmalig `yes` – Fingerprint: `SHA256:nOHK++kJYUJz1bqUY1AM6defn36vTXsgWuSEhr3ltLk` | -| `upterm` nicht gefunden | PATH noch nicht aktiv | PowerShell neu starten |