262 lines
6.1 KiB
Markdown
262 lines
6.1 KiB
Markdown
# 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) |
|