Files
upterm/README.md

262 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.
## Architektur
```
[Host-Maschine]
└─ upterm host --server wss://upterm.ebesch.de -- bash
│ Reverse SSH Tunnel
[uptermd Server]
▲ ▲
│ │
Port 2222 WSS :443
Portweiterleitung NPM → Port 8080
Router → LAN-IP
│ │
[Client] [Client]
ssh -p 2222 ... upterm proxy wss://...
(kein Extra-Tool) (upterm CLI nötig)
```
---
## Installation & Build
### Go installieren
```bash
curl -sL https://go.dev/dl/go1.22.4.linux-amd64.tar.gz -o /tmp/go.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf /tmp/go.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export PATH=$PATH:~/go/bin' >> ~/.bashrc
source ~/.bashrc
go version
```
### upterm & uptermd aus Source bauen
```bash
git clone https://github.com/owenthereal/upterm.git
cd upterm
go build -o /usr/local/bin/uptermd ./cmd/uptermd/
go build -o /usr/local/bin/upterm ./cmd/upterm/
```
### 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
Siehe [`uptermd.service`](uptermd.service).
```bash
systemctl daemon-reload
systemctl enable --now uptermd
systemctl status uptermd
```
> **Wichtig:** Kein `Type=forking` uptermd daemonisiert sich nicht selbst.
---
## Erreichbarkeit
### Primär: Port 2222 via Portweiterleitung im Router
Einfachste Lösung direkte TCP-Weiterleitung, kein Proxy nötig.
| Feld | Wert |
|------|------|
| Externer Port | `2222` |
| Internes Ziel | LAN-IP Server |
| Interner Port | `2222` |
| Protokoll | TCP |
```bash
ssh -p 2222 TOKEN:HASH@upterm.ebesch.de
```
### Alternativ: WebSocket via Nginx Proxy Manager (Port 443)
Für Clients hinter restriktiven Firewalls. Erfordert `upterm` CLI auf Client-Seite.
| Feld | Wert |
|------|------|
| Domain | `upterm.ebesch.de` |
| Forward Host | LAN-IP Server |
| Forward Port | `8080` |
| WebSocket Support | ✅ aktivieren |
| 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";
```
```bash
ssh -o ProxyCommand='upterm proxy wss://TOKEN@upterm.ebesch.de' \
TOKEN@upterm.ebesch.de:443
```
---
## 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
```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' \
-- tmux new -t shared
# 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
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
| Verbindungsweg | Client braucht |
|---|---|
| SSH Port 2222 (Portweiterleitung) | Nur `ssh` nichts installieren |
| WebSocket WSS Port 443 | `upterm` CLI |
---
## Referenzen
- [GitHub owenthereal/upterm](https://github.com/owenthereal/upterm)
- [upterm.dev](https://upterm.dev)
---
## Windows Client
### Installation via Scoop (empfohlen)
**Scoop installieren** (PowerShell als Administrator):
```powershell
Invoke-RestMethod -Uri https://get.scoop.sh | Invoke-Expression
```
**Bekanntes Problem: 7zip-Extraktion schlägt fehl (Exit code 1640)**
7zip installiert sich via MSI und schlägt auf manchen Windows-Systemen mit folgendem Fehler fehl:
```
ERROR Exit code was 1640!
Failed to extract files from ...\7z2601-x64.msi.
```
**Workaround:** `lessmsi` als alternativen MSI-Extraktor verwenden:
```powershell
# Fehlgeschlagene Installation bereinigen
scoop uninstall 7zip
scoop cache rm 7zip
# lessmsi als MSI-Extraktor aktivieren
scoop config use_lessmsi true
# 7zip erneut installieren diesmal via lessmsi
scoop install 7zip
```
**upterm installieren:**
```powershell
scoop bucket add upterm https://github.com/owenthereal/scoop-upterm
scoop install upterm
```
---
### Nutzung unter Windows
**Session starten (PowerShell):**
```powershell
# Eigener Server, automatisch akzeptieren
upterm host --server ssh://upterm.ebesch.de:2222 --accept
# Beim ersten Verbinden: Host-Key bestätigen mit "yes"
# Danach erscheint der Token direkt:
# ➤ SSH: ssh TOKEN:HASH@upterm.ebesch.de -p 2222
```
> Unter Windows startet upterm standardmäßig eine `powershell -NoLogo` Session statt `bash`.
**Client verbindet sich (nur SSH nötig):**
```powershell
ssh TOKEN:HASH@upterm.ebesch.de -p 2222
```
---
### Troubleshooting
| Problem | Lösung |
|---------|--------|
| 7zip Exit code 1640 | `scoop config use_lessmsi true`, dann `scoop install 7zip` neu |
| Host-Key Warnung | Einmalig mit `yes` bestätigen; Fingerprint: `SHA256:nOHK++kJYUJz1bqUY1AM6defn36vTXsgWuSEhr3ltLk` |
| `upterm` nicht gefunden | PowerShell neu starten (PATH wird erst nach Neustart übernommen) |