
Sicheren Fernzugriff auf einen Rechner mit interaktiver Shell, Dateiübertragung und Web-Proxy über Ende-zu-Ende-verschlüsseltes Peer-to-Peer-WebRTC einrichten, über einen Browser oder die CLI, ohne Port-Weiterleitung oder Konten.
BitBang CLI ist ein Fernzugriffs-Multitool als einzelne statische Binärdatei: Sie öffnen eine interaktive Shell, durchsuchen und übertragen Dateien und greifen aus jedem Browser auf Web-Apps im Netzwerk der entfernten Maschine zu – ohne Portweiterleitung, ohne Konfiguration und ohne Konto.

Auf der Maschine, die Sie erreichen möchten:
curl -sSfL bitba.ng/install | sh
bitbang serve
serve gibt eine URL aus. Öffnen Sie sie in einem beliebigen Browser und Sie erhalten ein Terminal, einen Dateibrowser und einen Proxy zum Netzwerk dieser Maschine – oder verbinden Sie sich mit bitbang connect <url> von einem anderen Terminal aus mit derselben Binärdatei. Die Verbindung ist Ende-zu-Ende-verschlüsselt und Peer-to-Peer; der bitba.ng-Server stellt die beiden Enden einander vor und tritt dann zur Seite.
bitbang ist eine einzelne statische Go-Binärdatei. Es ist Teil des BitBang-Projekts; dieses Whitepaper behandelt das Design ausführlich.
Wenn Sie keine URL einfügen oder einen QR-Code scannen können – etwa wenn Sie telefonieren oder in Rufweite sind –, gibt bitbang serve zusätzlich einen kurzen Pairing-Code aus. Die andere Partei öffnet bitba.ng/<code> (oder führt bitbang connect <code> aus), auf ihrem Bildschirm erscheint eine zweite 6-stellige Zahl, und sie liest Ihnen diese vor. Sie tippen sie zur Bestätigung ein. Ein Man-in-the-Middle kann die beiden Zahlen nicht zur Übereinstimmung bringen, und das Pairing speichert die Verbindungsdaten des Geräts für das nächste Mal, z. B. bitbang connect nas1. Wenn Sie Magic Wormhole kennen: Die Form ist ähnlich – ein gesprochener Code, der zwei Maschinen sicher einander vorstellt.

bitbang ist wie ssh aufgebaut: serve, connect und cp entsprechen sshd, ssh und scp, mit WebRTC als Transport anstelle von TCP. Für eine Maschine, in die Sie bereits bequem per SSH einsteigen, bringt dieser Unterschied nicht viel. Aber der Großteil von bitbang entstand aus Ärgernissen, auf die ich häufiger zu stoßen scheine, als mir lieb ist:
Erreichbarkeit. Fern-SSH-Zugriff benötigt einen eingehenden Pfad, und in den meisten Netzwerken liegt das Öffnen eines solchen nicht in Ihrer Hand – CGNAT (Mobilfunk, Starlink, viele ISPs), Firmen-, Universitäts- oder Kommunalnetze. In der Praxis bauen Sie also ein zweites System an: Tailscale, ein VPN, ngrok – eine weitere Installation, ein weiteres Konto, ein weiterer Daemon, der am Laufen gehalten werden muss. bitbang serve benötigt keinen offenen Port und funktioniert von überall.
Einrichtung. SSH muss erst aktiviert und konfiguriert werden, bevor es Sie hereinlässt. Auf Raspberry Pi OS ist es standardmäßig deaktiviert und oft nur mit Schlüsseln nutzbar, was bedeutet, dass Sie zuerst Ihren öffentlichen Schlüssel auf die Maschine bringen müssen. Und wie machen Sie das? E-Mail oder ein USB-Stick sind meist die schmerzlosesten Optionen. bitbang richtet die Verbindung stattdessen über einen Austausch eines 6-stelligen Codes ein – etwas, das Sie sicher am Telefon tun oder quer durch den Raum rufen können. Es läuft außerdem als normaler Benutzer – kein Root, kein Daemon, keine Konfigurationsdatei.
Proxy-Nutzung. Wenn Sie eine Web-App im Netzwerk dieser Maschine nutzen möchten, erhalten Sie per SSH einen separaten Tunnel pro App, der im Voraus benannt wird. Der bitbang-Proxy ist generisch: Sie geben die URL der Web-App zum Zeitpunkt der Verbindung an.
Browser-Client. SSH benötigt auf der verbindenden Seite einen SSH-Client sowie einen Schlüssel oder ein Passwort. bitbang benötigt einen Browser – also ein Telefon, ein geliehenes Laptop oder jemanden, der noch nie ein Terminal geöffnet hat. Geben Sie ihnen die URL, und sie erhalten den Zugriff, den Sie ihnen gewährt haben.
bitbang verwendenJede Verbindung hat zwei Enden: einen Listener (bitbang serve, läuft auf der Maschine, die erreicht werden soll) und einen Connector (einen Browser oder die bitbang-CLI auf der Maschine, die die Verbindung herstellt). Eine Listener-URL bedient beide Arten von Connectors.
bitbang servebitbang serve # everything: shell + files + proxy on one URL
bitbang serve shell # shell only
bitbang serve files ~/share # files only (add -upload to allow uploads)
bitbang serve proxy # proxy; pick the target in the browser
bitbang serve proxy localhost:8080 # ...or pin a single target
Jede Variante gibt einen QR-Code, eine URL und einen Pairing-Code aus.
Öffnen Sie die URL. Je nachdem, was bereitgestellt wird, erhalten Sie:
nas.local, 192.168.1.10:8080, localhost:3000/admin) und nutzen Sie die App, als wären Sie lokal. Anmeldungen, Cookies, Uploads und Streaming funktionieren alle.bitbang connect <url> # interactive shell
bitbang connect <url> -- tail -f /var/log/syslog # one-shot command
bitbang cp <url>:/var/log/app.log ./app.log # copy files, scp-style
bitbang cp - <url>:/tmp/firmware.bin < firmware.bin # stdin/stdout work too
Jede erfolgreiche Verbindung und jedes Pairing werden in ~/.bitbang/devices.json gespeichert, sodass ab dann ein kurzer Name genügt: bitbang connect nas1.
Der Einzeiler erkennt Ihre Architektur (amd64, arm64, armv7), lädt die Binärdatei aus dem neuesten GitHub-Release herunter, prüft ihre SHA-256-Summe gegen die checksums.txt des Releases und installiert sie nach ~/.local/bin/bitbang.
Eine Version festlegen, den Speicherort ändern oder das Skript zuerst prüfen:
curl -sSfL bitba.ng/install | sh -s -- --version v0.5.0
curl -sSfL bitba.ng/install | sh -s -- --prefix /usr/local/bin
curl -sSfL bitba.ng/install -o install.sh && less install.sh && sh install.sh
macOS- und Windows-Builds sind in Arbeit – für jede Plattform wurden Issues erstellt (macOS, windows) – reagieren Sie einfach oder posten Sie, um mir zu zeigen, dass Sie interessiert sind. Manuelle Installation: Laden Sie die Binärdatei aus den Releases herunter und legen Sie sie in Ihren PATH. Aus dem Quellcode bauen: siehe unten.
bitba.ng/install ist eine Weiterleitung, kein gehostetes Skript. Die Kette:
curl ruft https://bitba.ng/install auf, das per 302 auf install.sh in diesem Repository (auf main) weiterleitet.https://github.com/richlegrand/bitbang-cli/releases/latest/download/bitbang-linux-<arch> herunter.checksums.txt aus demselben Release ab und prüft die SHA-256-Summe der Binärdatei.~/.local/bin (überschreibbar).Das Installationsskript liegt in diesem Repository direkt neben dem Code, den es installiert – so können Sie es zusammen mit der Binärdatei prüfen, und der kanonische bitba.ng-Host besitzt nur die Kurz-URL. Selbst-Hoster können das /install ihres eigenen Hosts auf jedes von ihnen ausgelieferte Skript zeigen lassen: Die Umgebungsvariable INSTALL_URL des Signalisierungsservers steuert das Weiterleitungsziel (leer → 404).
bitbang ein RSA-Schlüsselpaar unter ~/.bitbang/<program>/; die Geräte-UID wird vom öffentlichen Schlüssel abgeleitet, sodass das Vortäuschen eines Geräts bedeutet, ein zweites Urbild seiner UID zu finden.#…), das Browser niemals senden – bitba.ng vermittelt die Verbindung, ohne jemals die Anmeldeinformationen zu sehen, die sie autorisieren.--pin) für dauerhafte oder Headless-Setups und Wegwerf-Modus (-ephemeral) für eine neue Identität bei jedem Lauf.Wie die beiden Enden einander authentifizieren, ohne dem Signalisierungsserver zu vertrauen, wird hier ausführlich behandelt: Trustless Signaling: Authentication Without a Central Authority.
Flags akzeptieren beide Formen (-pin oder --pin). Boolesche Flags sind standardmäßig deaktiviert, sofern nicht anders angegeben.
bitbang serve [flags] All capabilities: shell + files + proxy on one URL
bitbang serve shell [flags] Shell only
bitbang serve files [PATH] [flags] Files only (PATH defaults to cwd)
bitbang serve proxy [TARGET] [flags] HTTP/WebSocket reverse proxy (TARGET pins one host:port)
bitbang connect <target> [-- cmd …] Client shell (interactive or one-shot)
bitbang cp <src> <dst> Copy files (one side is <URL>:/path, or '-')
bitbang version Print version (also --version)
bitbang help Usage (also --help, -h)
bitbang serve – einen Listener ausführenGemeinsame Flags (alle vier serve-Formen):
Shell-Flags (serve und serve shell):
Datei-Flags:
| Form | Pfad | Upload-Flag |
|---|---|---|
serve (alle Fähigkeiten) | -files PATH (Standard: cwd) |
(Fortgeschritten: -video-fd N übergibt einen geerbten Socketpair-FD an einen externen Video-Helfer; für interne/Einbettungszwecke.)
bitbang connect <target> [-- command …] – Client-Shell<target> kann eines der folgenden sein:
nas1; wird aus der Known-Hosts-Tabelle aufgelöst (siehe unten)482731; führt den Pairing-Ablauf aus und verbindet sich dannhttps://bitba.ng/<id>#<code>, bitba.ng/<id>#<code> oder nur <id>#<code>Ohne -- command wird eine interaktive Shell geöffnet (ein PTY, wenn stdin ein Terminal ist). Mit -- command args… wird dieser einzelne Befehl nicht-interaktiv ausgeführt und mit seinem Status beendet (Beenden durch Signale meldet 128).
bitbang cp <src> <dst> – Dateien kopierenGenau eines von <src> / <dst> ist remote und wird als <URL>:/path geschrieben (URL in jeder Form, die connect akzeptiert). - bedeutet stdin/stdout, sodass cp <URL>:/f - nach stdout streamt und cp - <URL>:/f von stdin hochlädt. Ein abschließendes / oder . auf der lokalen Seite behält den Remote-Basename (scp-Stil).
Jede erfolgreiche Verbindung und jedes Pairing werden in ~/.bitbang/devices.json (Modus 0600) gespeichert, sodass Sie sich über einen kurzen Namen statt einer URL oder eines Codes neu verbinden können:
bitbang connect 482731 -name nas1 # pair once, save it as "nas1"
bitbang connect nas1 # thereafter, just the name
-name NAME wählt den Namen; es gilt nur für einen neuen Host. Ohne diese Option wird ein automatischer Name (device1, device2, …) vergeben und ausgegeben (Saved as "device1".).- oder _ enthalten. Das garantiert, dass er nie mit einem 6-stelligen Code oder einer URL verwechselt werden kann. Nachschlagen und Eindeutigkeit sind unabhängig von Groß-/Kleinschreibung.bitbang connect nas1 -name nas2 wird abgelehnt – -name ist nur für das erste Speichern gedacht.{name, uid, access_code, server, paired_at}. Die Wiederverbindung mit einem bekannten Host (per Name oder URL) aktualisiert den Eintrag an Ort und Stelle und behält den Namen.Erfordert Go 1.25+. Reines Go, statisch gelinkt (CGO_ENABLED=0) – triviales Cross-Compiling, keine Laufzeitabhängigkeiten.
go build ./cmd/bitbang/
# cross-compile:
GOOS=linux GOARCH=arm64 go build -o bitbang-arm64 ./cmd/bitbang/
GOOS=linux GOARCH=arm GOARM=7 go build -o bitbang-armv7 ./cmd/bitbang/
GOOS=windows GOARCH=amd64 go build -o bitbang.exe ./cmd/bitbang/
GOOS=darwin GOARCH=arm64 go build -o bitbang-macos ./cmd/bitbang/
Heute im Lieferumfang: Shell, Dateien und Proxy, erreichbar über den Browser oder die CLI, plus scp-artiges Dateikopieren und Ad-hoc-Pairing mit einer gespeicherten Gerätetabelle. Entworfen und in Arbeit:
/dev/ttyUSB0 über einen lokalen virtuellen Port ansteuern (z. B. Arduino IDE über das Internet ausführen). Ein Issue wurde hier eröffnet.-L 5432:db.internal:5432, um nur im LAN erreichbare Dienste zu erreichen. Ein Issue wurde hier eröffnet.MIT – siehe LICENSE.
Issues und PRs sind willkommen.
| ngrok | Cloudflare Tunnel | Tailscale | bitbang |
|---|
| Konto erforderlich | Ja | Ja | Ja | Nein |
| Installation auf der verbindenden Seite | Nein | Nein | Ja | Nein (Browser) |
| Ende-zu-Ende-verschlüsselt | Nicht standardmäßig | Nein | Ja | Ja |
| Datenpfad | Deren Server | Deren Server | P2P | P2P |
| Selbst hostbarer Server (Open Source) | Nein | Nein | Nein (Headscale ist ein Drittanbieter-Projekt) | Ja |
| Einrichtung vor der ersten Nutzung | Konto + Authtoken | Konto + DNS | Konto + Anmeldung auf jedem Gerät | Einen Befehl ausführen |
| Flag | Standard | Beschreibung |
|---|
-server HOST | bitba.ng | Hostname des Signalisierungsservers |
-pin PIN | (keiner) | Diese PIN für Verbindungen verlangen |
-ephemeral | off | Temporäre Identität (bei jedem Lauf eine neue URL) |
-nocode | off | Code-Austausch-Pairing deaktivieren – es wird kein 6-stelliger Code ausgegeben; die URL funktioniert weiterhin. Für headless/non-TTY-Listener verwenden, die die SAS-Abfrage nicht abschließen können. |
-program NAME | bitbang | Identitätsname; Schlüsselpaar gespeichert unter ~/.bitbang/<NAME>/identity.pem |
-target HOST:PORT | (dynamisch) | Festes Proxy-Ziel (Proxy-Modus); leer = Ziel im Browser wählen. serve proxy host:port ist die Kurzform dafür. |
-v | off | Ausführliche Protokollierung (fügt das !debug-Overlay im Browser hinzu) |
| Flag | Standard | Beschreibung |
|---|
-shell-cmd CMD | $SHELL oder /bin/sh | Zu startende Shell |
-shell-max-sessions N | 1 | Max. gleichzeitige Shell-Sitzungen (0 = unbegrenzt) |
-shell-mirror | on | Shell-Ausgabe in der Konsole des Listeners spiegeln |
-files-upload |
serve files [PATH] | positionsabhängiges PATH (Standard: cwd) | -upload |
| Flag | Standard | Beschreibung |
|---|
-name NAME | (auto) | Diesen Host unter NAME speichern (nur bei neuen Hosts; weist bei Weglassen automatisch device<N> zu) |
-relay | off | TURN-Relay von vornherein anfordern statt nur beim Fallback (ICE bevorzugt weiterhin einen direkten Pfad, falls einer gelingt) |
-pin PIN | (Eingabeaufforderung) | PIN senden, falls der Listener eine verlangt (überspringt die interaktive Eingabeaufforderung) |
-timeout DUR | 30s | Verbindungsaufbau-Timeout (z. B. 45s, 1m) |
-server HOST | bitba.ng | Signalisierungsserver – nur im Pair-Code-Modus; die URL-Form enthält ihren eigenen Host |
-v | off | Ausführliche Protokollierung |
| Flag | Standard | Beschreibung |
|---|
-relay | off | TURN-Relay von vornherein anfordern (wie bei connect) |
-pin PIN | (Eingabeaufforderung) | PIN senden, falls erforderlich |
-timeout DUR | 30s | Verbindungsaufbau-Timeout |
-v | off | Ausführliche Protokollierung |