
Stabilisci un accesso remoto sicuro a una macchina con shell interattiva, trasferimento file e proxy web tramite WebRTC peer-to-peer crittografato end-to-end, usando un browser o CLI senza inoltro di porte o account.
BitBang CLI è un multi-strumento di accesso remoto in un singolo binario statico: apri una shell interattiva, sfoglia e trasferisci file, e accedi alle app web sulla rete della macchina remota da qualsiasi browser, senza port forwarding, senza configurazione e senza account.

Sulla macchina a cui vuoi accedere:
curl -sSfL bitba.ng/install | sh
bitbang serve
serve stampa un URL. Aprilo in qualsiasi browser e ottieni un terminale, un file browser e un proxy verso la rete di quella macchina -- oppure collegati da un altro terminale con bitbang connect <url> usando lo stesso binario. La connessione è crittografata end-to-end e peer-to-peer; il server bitba.ng presenta le due estremità e poi si fa da parte.
bitbang è un singolo binario Go statico. Fa parte del progetto BitBang; questo whitepaper approfondisce il design.
Quando non puoi incollare un URL o scansionare un codice QR, ad esempio se sei al telefono o a pochi metri di distanza, bitbang serve stampa anche un breve codice di abbinamento. L'altra persona apre bitba.ng/<code> (o esegue bitbang connect <code>), il suo schermo mostra un secondo numero a 6 cifre, e loro ti leggono quello ad alta voce. Lo digiti per approvare. Un machine-in-the-middle non può far combaciare i due numeri, e l'abbinamento salva le credenziali di connessione del dispositivo per la volta successiva, ad es. bitbang connect nas1. Se conosci Magic Wormhole, la forma è simile: un codice pronunciato che introduce in modo sicuro due macchine.

bitbang ha la forma di ssh: serve, connect e cp corrispondono a sshd, ssh e scp, con WebRTC come trasporto invece di TCP. Per una macchina a cui puoi già accedere comodamente via SSH, questa differenza non ti dà granché. Ma gran parte di bitbang nasce da fastidi che mi sembra di incontrare più spesso di quanto dovrei:
Raggiungibilità. L'accesso SSH remoto richiede un percorso in entrata, e sulla maggior parte delle reti aprire un percorso del genere non dipende da te -- CGNAT (rete mobile, Starlink, molti ISP), rete aziendale, universitaria, municipale. Quindi in pratica ti ritrovi ad aggiungere un secondo sistema: Tailscale, una VPN, ngrok -- un'altra installazione, un altro account, un altro demone da tenere in esecuzione. bitbang serve non richiede porte aperte e funziona da qualsiasi luogo.
Configurazione. SSH deve essere abilitato e configurato prima di farti entrare. È disabilitato di default su Raspberry Pi OS, e spesso solo-chiave, il che significa che devi prima portare la tua chiave pubblica sulla macchina. E come fai? Email o una chiavetta USB sono di solito le opzioni meno dolorose. bitbang imposta la connessione con uno scambio di codice a 6 cifre -- qualcosa che puoi fare in sicurezza al telefono, o gridando attraverso la stanza. Inoltre gira come utente normale -- niente root, niente demone, niente file di configurazione.
Proxy. Se vuoi un'app web sulla rete di quella macchina, SSH ti dà un tunnel separato per ogni app, nominato in anticipo. Il proxy di bitbang è generico: specifica l'URL dell'app web al momento della connessione.
Client browser. SSH richiede un client SSH e una chiave o password sul lato connettente. bitbang richiede un browser -- il che significa un telefono, un laptop preso in prestito, o qualcuno che non ha mai aperto un terminale. Dagli l'URL e ottengono l'accesso che hai concesso loro.
bitbangOgni connessione ha due estremità: un listener (bitbang serve, in esecuzione sulla macchina a cui si accede) e un connector (un browser, o la CLI bitbang, sulla macchina che accede). Un singolo URL del listener serve entrambi i tipi di connector.
bitbang servebitbang serve # tutto: shell + file + proxy su un unico URL
bitbang serve shell # solo shell
bitbang serve files ~/share # solo file (aggiungi -upload per consentire gli upload)
bitbang serve proxy # proxy; scegli la destinazione nel browser
bitbang serve proxy localhost:8080 # ...oppure fissa una singola destinazione
Ognuno stampa un codice QR, un URL e un codice di abbinamento.
Apri l'URL. A seconda di cosa viene servito, ottieni:
nas.local, 192.168.1.10:8080, localhost:3000/admin) e usa l'app come se fossi in locale. Login, cookie, upload e streaming funzionano tutti.bitbang connect <url> # shell interattiva
bitbang connect <url> -- tail -f /var/log/syslog # comando singolo
bitbang cp <url>:/var/log/app.log ./app.log # copia file, stile scp
bitbang cp - <url>:/tmp/firmware.bin < firmware.bin # anche stdin/stdout funzionano
Ogni connessione o abbinamento riuscito viene salvato in ~/.bitbang/devices.json, quindi d'ora in poi basta un nome breve: bitbang connect nas1.
La one-liner rileva la tua architettura (amd64, arm64, armv7), scarica il binario dall'ultima release di GitHub, verifica il suo SHA-256 rispetto al checksums.txt della release, e installa in ~/.local/bin/bitbang.
Fissa una versione, cambia la posizione, o controlla prima lo script:
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
Le build per macOS e Windows stanno arrivando -- sono state create delle issue per ciascuna (macOS, windows, basta reagire o commentare per farmi capire che siete interessati. Installazione manuale: scarica il binario dalle Release e mettilo nel tuo PATH. Build dal sorgente: vedi sotto.
bitba.ng/install è un redirect, non uno script ospitato. La catena:
curl colpisce https://bitba.ng/install, che fa un 302 verso install.sh in questa repo (su main).https://github.com/richlegrand/bitbang-cli/releases/latest/download/bitbang-linux-<arch>.checksums.txt dalla stessa release e verifica lo SHA-256 del binario.~/.local/bin (sovrascrivibile).Lo script di installazione vive in questa repo, accanto al codice che installa -- così puoi esaminarlo insieme al binario, e l'host canonico bitba.ng possiede solo l'URL breve. Chi si auto-ospita può puntare /install del proprio host a qualsiasi script voglia: la variabile d'ambiente INSTALL_URL del server di segnalazione controlla la destinazione del redirect (vuota → 404).
bitbang genera una coppia di chiavi RSA in ~/.bitbang/<program>/; l'UID del dispositivo è derivato dalla chiave pubblica, quindi impersonare un dispositivo significa trovare una seconda preimmagine del suo UID.#…), che i browser non inviano mai -- bitba.ng fa da intermediario per la connessione senza vedere mai la credenziale che la autorizza.--pin) per configurazioni permanenti o headless, e modalità usa-e-getta (-ephemeral) per una nuova identità a ogni esecuzione.Come le due estremità si autenticano a vicenda senza fidarsi del server di segnalazione è trattato in dettaglio qui: Trustless Signaling: Authentication Without a Central Authority.
I flag accettano entrambe le forme (-pin o --pin). I flag booleani sono disattivati di default salvo diversa indicazione.
bitbang serve [flags] Tutte le funzionalità: shell + file + proxy su un unico URL
bitbang serve shell [flags] Solo shell
bitbang serve files [PATH] [flags] Solo file (PATH predefinito = cwd)
bitbang serve proxy [TARGET] [flags] Proxy inverso HTTP/WebSocket (TARGET fissa un host:port)
bitbang connect <target> [-- cmd …] Shell client (interattiva o monouso)
bitbang cp <src> <dst> Copia file (un lato è <URL>:/percorso, o '-')
bitbang version Stampa la versione (anche --version)
bitbang help Utilizzo (anche --help, -h)
bitbang serve -- esegui un listenerFlag condivisi (tutte e quattro le forme di serve):
Flag della shell (serve e serve shell):
Flag dei file:
| Forma | Percorso | Flag di upload |
|---|---|---|
serve (tutte le funzionalità) | -files PATH (default cwd) | -files-upload |
(Avanzato: -video-fd N passa un FD di socketpair ereditato a un helper video esterno; per uso interno/embedding.)
bitbang connect <target> [-- comando …] -- shell client<target> può essere uno qualsiasi di:
nas1; risolto dalla tabella known-hosts (vedi sotto)482731; esegue il flusso di abbinamento, poi si connettehttps://bitba.ng/<id>#<code>, bitba.ng/<id>#<code>, o <id>#<code> nudoSenza -- comando, apre una shell interattiva (una PTY quando stdin è un terminale). Con -- comando args…, esegue quel singolo comando in modo non interattivo ed esce con il suo stato di uscita (le uscite per segnale riportano 128).
bitbang cp <src> <dst> -- copia fileEsattamente uno tra <src> / <dst> è remoto, scritto <URL>:/percorso (URL in qualsiasi forma accettata da connect). - significa stdin/stdout, quindi cp <URL>:/f - fa streaming su stdout e cp - <URL>:/f carica da stdin. Uno / o . finale sul lato locale mantiene il nome base remoto (stile scp).
Ogni connessione o abbinamento riuscito viene ricordato in ~/.bitbang/devices.json (modalità 0600), così puoi riconnetterti con un nome breve invece di un URL o un codice:
bitbang connect 482731 -name nas1 # abbina una volta, salvalo come "nas1"
bitbang connect nas1 # da allora in poi, solo il nome
-name NAME sceglie il nome; si applica solo a un host nuovo. Senza di esso, viene assegnato e stampato un nome automatico (device1, device2, …) (Salvato come "device1".).- o _. Questo garantisce che non possa mai essere confuso con un codice a 6 cifre o un URL. Ricerche e unicità sono case-insensitive.bitbang connect nas1 -name nas2 viene rifiutato -- -name è solo per i salvataggi al primo utilizzo.{name, uid, access_code, server, paired_at}. Riconnettere un host noto (per nome o URL) lo aggiorna sul posto e mantiene il nome.Richiede Go 1.25+. Puro Go, linkato staticamente (CGO_ENABLED=0) -- cross-compilazione banale, nessuna dipendenza a runtime.
go build ./cmd/bitbang/
# cross-compila:
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/
Disponibile oggi: shell, file e proxy, raggiungibili dal browser o dalla CLI, più copia file stile scp e abbinamento ad-hoc con una tabella di dispositivi salvata. Progettato e in arrivo:
/dev/ttyUSB0 remota da una porta virtuale locale (ad es. eseguire Arduino IDE su internet). È stata aperta una issue qui.-L 5432:db.internal:5432 per raggiungere servizi solo-LAN. È stata aperta una issue qui.MIT -- vedi LICENSE.
Issue e PR sono benvenute.
| ngrok | Cloudflare Tunnel | Tailscale | bitbang |
|---|
| Account richiesto | Sì | Sì | Sì | No |
| Installazione sul lato connettente | No | No | Sì | No (browser) |
| Crittografia end-to-end | Non di default | No | Sì | Sì |
| Percorso dei dati | I loro server | I loro server | P2P | P2P |
| Server auto-ospitabile (open source) | No | No | No (Headscale è di terze parti) | Sì |
| Configurazione prima del primo uso | Account + authtoken | Account + DNS | Account + login su ogni dispositivo | Esegui un comando |
| Flag | Default | Descrizione |
|---|
-server HOST | bitba.ng | Hostname del server di segnalazione |
-pin PIN | (nessuno) | Richiedi questo PIN per le connessioni |
-ephemeral | off | Identità temporanea (un nuovo URL a ogni esecuzione) |
-nocode | off | Disabilita l'abbinamento con scambio di codice -- non viene emesso alcun codice a 6 cifre; l'URL funziona comunque. Da usare per listener headless/non-TTY che non possono completare il prompt SAS. |
-program NAME | bitbang | Nome dell'identità; coppia di chiavi salvata in ~/.bitbang/<NAME>/identity.pem |
-target HOST:PORT | (dinamico) | Destinazione proxy fissa (modalità proxy); vuoto = scegli la destinazione nel browser. serve proxy host:port è una scorciatoia per questo. |
-v | off | Log dettagliato (aggiunge l'overlay !debug nel browser) |
| Flag | Default | Descrizione |
|---|
-shell-cmd CMD | $SHELL o /bin/sh | Shell da avviare |
-shell-max-sessions N | 1 | Numero massimo di sessioni shell simultanee (0 = illimitato) |
-shell-mirror | on | Specchia l'output della shell nella console del listener |
serve files [PATH] | PATH posizionale (default cwd) | -upload |
| Flag | Default | Descrizione |
|---|
-name NAME | (auto) | Ricorda questo host con il nome NAME (solo per nuovi host; assegna automaticamente device<N> se omesso) |
-relay | off | Richiede un relay TURN in anticipo invece che solo in fallback (ICE preferisce comunque un percorso diretto se riesce) |
-pin PIN | (prompt) | PIN da inviare se il listener lo richiede (salta il prompt interattivo) |
-timeout DUR | 30s | Timeout di connessione (ad es. 45s, 1m) |
-server HOST | bitba.ng | Server di segnalazione -- solo modalità codice di abbinamento; la forma URL porta con sé il proprio host |
-v | off | Log dettagliato |
| Flag | Default | Descrizione |
|---|
-relay | off | Richiede un relay TURN in anticipo (come in connect) |
-pin PIN | (prompt) | PIN da inviare se richiesto |
-timeout DUR | 30s | Timeout di connessione |
-v | off | Log dettagliato |