
Estabeleça acesso remoto seguro a uma máquina com shell interativo, transferência de arquivos e proxy web sobre WebRTC peer-to-peer criptografado de ponta a ponta, usando um navegador ou CLI sem encaminhamento de portas ou contas.
O BitBang CLI é uma ferramenta multitool de acesso remoto em um único binário estático: abra um shell interativo, navegue e transfira arquivos, e acesse aplicativos web na rede da máquina remota a partir de qualquer navegador, sem redirecionamento de porta, sem configuração e sem conta.

Na máquina que você deseja acessar:
curl -sSfL bitba.ng/install | sh
bitbang serve
serve imprime uma URL. Abra-a em qualquer navegador e você terá um terminal, um navegador de arquivos e um proxy para a rede dessa máquina — ou conecte-se de outro terminal com bitbang connect <url> usando o mesmo binário. A conexão é criptografada de ponta a ponta e ponto a ponto; o servidor bitba.ng apresenta as duas extremidades e depois se afasta.
bitbang é um único binário Go estático. Faz parte do projeto BitBang; este whitepaper aborda o design em profundidade.
Quando você não consegue colar uma URL ou escanear um QR code, como quando está ao telefone ou ao alcance da voz, bitbang serve também imprime um código de emparelhamento curto. A outra parte abre bitba.ng/<code> (ou executa bitbang connect <code>), a tela dela mostra um segundo número de 6 dígitos, e ela lê esse número de volta para você. Você o digita para aprovar. Um intermediário não consegue fazer os dois números coincidirem, e o emparelhamento salva as credenciais de conexão do dispositivo para a próxima vez, ex.: bitbang connect nas1. Se você conhece o Magic Wormhole, o formato é semelhante — um código falado que apresenta duas máquinas com segurança.

bitbang tem o formato do ssh: serve, connect e cp mapeiam para sshd, ssh e scp, com WebRTC como transporte em vez de TCP. Para uma máquina na qual você já consegue entrar confortavelmente via SSH, essa diferença não traz muito benefício. Mas a maior parte do bitbang surgiu de inconvenientes que pareço encontrar com mais frequência do que deveria:
Alcance. O acesso SSH remoto precisa de um caminho de entrada, e na maioria das redes abrir um não é uma decisão sua — CGNAT (celular, Starlink, muitos provedores de internet), redes corporativas, universitárias, municipais. Então, na prática, você adiciona um segundo sistema: Tailscale, uma VPN, ngrok — outra instalação, outra conta, outro daemon para manter rodando. bitbang serve não precisa de porta aberta e funciona de qualquer lugar.
Configuração. O SSH precisa ser habilitado e configurado antes de deixar você entrar. Ele vem desabilitado por padrão no Raspberry Pi OS e, muitas vezes, apenas com chave, o que significa colocar sua chave pública na máquina primeiro. E como você faz isso? E-mail ou um pendrive geralmente são as opções mais indolores. bitbang configura a conexão com uma troca de código de 6 dígitos — algo que você pode fazer com segurança pelo telefone ou gritando do outro lado da sala. Ele também roda como um usuário comum — sem root, sem daemon, sem arquivo de configuração.
Proxy. Se você quer um aplicativo web na rede dessa máquina, o SSH oferece um túnel separado por aplicativo, nomeado antecipadamente. O proxy do bitbang é genérico: especifique a URL do aplicativo web no momento da conexão.
Cliente de navegador. O SSH precisa de um cliente SSH e uma chave ou senha no lado que conecta. bitbang precisa de um navegador — o que significa um telefone, um laptop emprestado ou alguém que nunca abriu um terminal. Entregue a URL e a pessoa terá o acesso que você concedeu.
bitbangToda conexão tem duas extremidades: um ouvinte (bitbang serve, executando na máquina que está sendo acessada) e um conector (um navegador, ou a CLI bitbang, na máquina que está acessando). Uma URL do ouvinte atende aos dois tipos de conector.
bitbang servebitbang serve # tudo: shell + arquivos + proxy em uma URL
bitbang serve shell # apenas shell
bitbang serve files ~/share # apenas arquivos (adicione -upload para permitir uploads)
bitbang serve proxy # proxy; escolha o destino no navegador
bitbang serve proxy localhost:8080 # ...ou fixe um único destino
Cada um imprime um QR code, uma URL e um código de emparelhamento.
Abra a URL. Dependendo do que está sendo servido, você obtém:
nas.local, 192.168.1.10:8080, localhost:3000/admin) e use o aplicativo como se estivesse local. Logins, cookies, uploads e streaming funcionam.bitbang connect <url> # shell interativo
bitbang connect <url> -- tail -f /var/log/syslog # comando de execução única
bitbang cp <url>:/var/log/app.log ./app.log # copiar arquivos, estilo scp
bitbang cp - <url>:/tmp/firmware.bin < firmware.bin # stdin/stdout também funcionam
Toda conexão ou emparelhamento bem-sucedido é salvo em ~/.bitbang/devices.json, então, a partir daí, um nome curto é suficiente: bitbang connect nas1.
O comando de uma linha detecta sua arquitetura (amd64, arm64, armv7), baixa o binário do release mais recente do GitHub, verifica seu SHA-256 contra o checksums.txt do release e instala em ~/.local/bin/bitbang.
Fixe uma versão, altere o local ou audite o script primeiro:
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
As versões para macOS e Windows estão a caminho — issues foram abertas para cada uma (macOS, windows; basta reagir ou postar para mostrar que você está interessado. Instalação manual: baixe o binário de Releases e coloque-o no seu PATH. Compilar a partir do código-fonte: veja abaixo.
bitba.ng/install é um redirecionamento, não um script hospedado. A cadeia:
curl acessa https://bitba.ng/install, que redireciona (302) para install.sh neste repositório (no branch main).https://github.com/richlegrand/bitbang-cli/releases/latest/download/bitbang-linux-<arch>.checksums.txt do mesmo release e verifica o SHA-256 do binário.~/.local/bin (sobrescrevível).O script de instalação vive neste repositório, ao lado do código que ele instala — para que você possa revisá-lo junto com o binário, e o host canônico bitba.ng é dono apenas da URL curta. Quem faz self-hosting pode apontar o /install do próprio host para qualquer script que desejar: a variável de ambiente INSTALL_URL do servidor de sinalização controla o destino do redirecionamento (vazia → 404).
bitbang gera um par de chaves RSA em ~/.bitbang/<program>/; o UID do dispositivo é derivado da chave pública, então personificar um dispositivo significa encontrar uma segunda pré-imagem do seu UID.#…), que os navegadores nunca enviam — bitba.ng intermediaria a conexão sem jamais ver a credencial que a autoriza.--pin) para configurações permanentes ou headless, e modo descartável (-ephemeral) para uma identidade nova a cada execução.Como as duas extremidades se autenticam mutuamente sem confiar no servidor de sinalização é abordado em detalhes aqui: Trustless Signaling: Authentication Without a Central Authority.
As flags aceitam ambas as formas (-pin ou --pin). Flags booleanas ficam desligadas por padrão, salvo indicação em contrário.
bitbang serve [flags] Todas as capacidades: shell + arquivos + proxy em uma URL
bitbang serve shell [flags] Apenas shell
bitbang serve files [PATH] [flags] Apenas arquivos (PATH padrão é o diretório atual)
bitbang serve proxy [TARGET] [flags] Proxy reverso HTTP/WebSocket (TARGET fixa um host:porta)
bitbang connect <target> [-- cmd …] Shell cliente (interativo ou de execução única)
bitbang cp <src> <dst> Copiar arquivos (um lado é <URL>:/path, ou '-')
bitbang version Exibe a versão (também --version)
bitbang help Uso (também --help, -h)
bitbang serve — executar um ouvinteFlags compartilhadas (todas as quatro formas de serve):
Flags de shell (serve e serve shell):
Flags de arquivos:
| Forma | Caminho | Flag de upload |
|---|---|---|
serve (todas as capacidades) | -files PATH (padrão: diretório atual) |
(Avançado: -video-fd N transmite um FD de socketpair herdado para um auxiliar de vídeo externo; para uso interno/embutido.)
bitbang connect <target> [-- comando …] — shell cliente<target> pode ser qualquer um dos seguintes:
nas1; resolvido pela tabela de hosts conhecidos (veja abaixo)482731; executa o fluxo de emparelhamento e depois conectahttps://bitba.ng/<id>#<code>, bitba.ng/<id>#<code> ou apenas <id>#<code>Sem -- comando, abre um shell interativo (um PTY quando o stdin é um terminal). Com -- comando args…, executa esse único comando de forma não interativa e encerra com o status dele (saídas por sinal são reportadas como 128).
bitbang cp <src> <dst> — copiar arquivosExatamente um de <src> / <dst> é remoto, escrito <URL>:/path (URL em qualquer forma aceita por connect). - significa stdin/stdout, então cp <URL>:/f - transmite para o stdout e cp - <URL>:/f envia do stdin. Uma / ou . final no lado local mantém o nome base remoto (estilo scp).
Toda conexão ou emparelhamento bem-sucedido é lembrado em ~/.bitbang/devices.json (modo 0600), para que você possa reconectar por um nome curto em vez de uma URL ou código:
bitbang connect 482731 -name nas1 # emparelha uma vez, salva como "nas1"
bitbang connect nas1 # daqui em diante, apenas o nome
-name NAME escolhe o nome; ele se aplica apenas a um host novo. Sem ele, um nome automático (device1, device2, …) é atribuído e impresso (Saved as "device1".).- ou _. Isso garante que ele nunca possa ser confundido com um código de 6 dígitos ou uma URL. Consultas e unicidade não diferenciam maiúsculas de minúsculas.bitbang connect nas1 -name nas2 é rejeitado — -name é apenas para salvamentos na primeira vez.{name, uid, access_code, server, paired_at}. Reconectar um host conhecido (por nome ou URL) atualiza a entrada no lugar e mantém o nome.Requer Go 1.25+. Go puro, linkado estaticamente (CGO_ENABLED=0) — compilação cruzada trivial, sem dependências de runtime.
go build ./cmd/bitbang/
# compilação cruzada:
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/
Disponível hoje: shell, arquivos e proxy, acessíveis pelo navegador ou pela CLI, além de cópia de arquivos estilo scp e emparelhamento ad-hoc com uma tabela de dispositivos salva. Projetado e a caminho:
/dev/ttyUSB0 remoto a partir de uma porta virtual local (ex.: usar o Arduino IDE pela internet). Uma issue foi aberta aqui.-L 5432:db.internal:5432 para alcançar serviços apenas na LAN. Uma issue foi aberta aqui.MIT — veja LICENSE.
Issues e PRs são bem-vindos.
| ngrok | Cloudflare Tunnel | Tailscale | bitbang |
|---|
| Conta necessária | Sim | Sim | Sim | Não |
| Instalação no lado que conecta | Não | Não | Sim | Não (navegador) |
| Criptografia de ponta a ponta | Não por padrão | Não | Sim | Sim |
| Caminho dos dados | Servidores deles | Servidores deles | P2P | P2P |
| Servidor com self-hosting (código aberto) | Não | Não | Não (Headscale é de terceiros) | Sim |
| Configuração antes do primeiro uso | Conta + authtoken | Conta + DNS | Conta + login em cada dispositivo | Execute um comando |
| Flag | Padrão | Descrição |
|---|
-server HOST | bitba.ng | Nome do host do servidor de sinalização |
-pin PIN | (nenhum) | Exigir este PIN para conexões |
-ephemeral | desligado | Identidade temporária (uma nova URL a cada execução) |
-nocode | desligado | Desativa o emparelhamento por troca de código — nenhum código de 6 dígitos é emitido; a URL continua funcionando. Use para ouvintes headless/não-TTY que não conseguem concluir o prompt SAS. |
-program NAME | bitbang | Nome da identidade; o par de chaves é armazenado em ~/.bitbang/<NAME>/identity.pem |
-target HOST:PORT | (dinâmico) | Destino fixo do proxy (modo proxy); vazio = escolher o destino no navegador. serve proxy host:port é uma forma abreviada disto. |
-v | desligado | Registro detalhado (adiciona a sobreposição !debug no navegador) |
| Flag | Padrão | Descrição |
|---|
-shell-cmd CMD | $SHELL ou /bin/sh | Shell a ser iniciado |
-shell-max-sessions N | 1 | Máximo de sessões de shell simultâneas (0 = ilimitado) |
-shell-mirror | ligado | Espelha a saída do shell no console do ouvinte |
-files-uploadserve files [PATH] | PATH posicional (padrão: diretório atual) | -upload |
| Flag | Padrão | Descrição |
|---|
-name NAME | (automático) | Lembrar este host como NAME (apenas para novos hosts; atribui automaticamente device<N> se omitido) |
-relay | desligado | Solicitar um relay TURN antecipadamente em vez de apenas no fallback (o ICE ainda prefere um caminho direto se um tiver sucesso) |
-pin PIN | (solicitado) | PIN a ser enviado se o ouvinte exigir um (pula o prompt interativo) |
-timeout DUR | 30s | Tempo limite de conexão (ex.: 45s, 1m) |
-server HOST | bitba.ng | Servidor de sinalização — apenas no modo código de emparelhamento; a forma de URL carrega seu próprio host |
-v | desligado | Registro detalhado |
| Flag | Padrão | Descrição |
|---|
-relay | desligado | Solicitar um relay TURN antecipadamente (como em connect) |
-pin PIN | (solicitado) | PIN a ser enviado se exigido |
-timeout DUR | 30s | Tempo limite de conexão |
-v | desligado | Registro detalhado |