
포트 포워딩이나 계정 없이 브라우저 또는 CLI를 사용하여, 종단 간 암호화된 피어투피어 WebRTC를 통해 대화형 셸, 파일 전송, 웹 프록시를 제공하는 머신에 대한 안전한 원격 접속을 설정합니다.
BitBang CLI는 단일 정적 바이너리 원격 접근 멀티툴입니다: 대화형 셸을 열고, 파일을 탐색·전송하며, 원격 머신의 네트워크에 있는 웹 앱에 어떤 브라우저에서든 접근할 수 있습니다. 포트 포워딩도, 설정도, 계정도 필요 없습니다.

접근하려는 머신에서:
curl -sSfL bitba.ng/install | sh
bitbang serve
serve는 URL을 출력합니다. 아무 브라우저에서나 그 URL을 열면 터미널, 파일 브라우저, 그 머신의 네트워크 프록시를 얻을 수 있습니다. 또는 같은 바이너리로 bitbang connect <url>을 사용해 다른 터미널에서 연결할 수도 있습니다. 연결은 종단 간 암호화되며 P2P입니다. bitba.ng 서버는 양쪽을 중개한 뒤 물러납니다.
bitbang은 단일 정적 Go 바이너리입니다. BitBang 프로젝트의 일부이며, 이 백서에서 설계를 자세히 다룹니다.
URL을 붙여넣거나 QR 코드를 스캔할 수 없는 경우(예: 통화 중이거나 소리로 전달해야 하는 거리에 있을 때), bitbang serve는 짧은 페어링 코드도 함께 출력합니다. 상대방은 bitba.ng/<code>를 열거나 bitbang connect <code>를 실행하면 화면에 두 번째 6자리 숫자가 표시되고, 그 숫자를 다시 당신에게 읽어줍니다. 당신이 그 숫자를 입력하면 승인됩니다. 중간자 공격은 두 숫자를 일치시킬 수 없으며, 페어링은 다음에 사용할 기기 연결 자격 증명을 저장합니다(예: bitbang connect nas1). Magic Wormhole을 알고 있다면 형태가 비슷합니다. 두 머신을 안전하게 소개하는 구두 코드입니다.

bitbang은 ssh와 같은 형태입니다: serve, connect, cp는 sshd, ssh, scp에 대응하며, 전송 계층으로 TCP 대신 WebRTC를 사용합니다. 이미 SSH로 편하게 접속할 수 있는 머신이라면 그 차이는 별로 체감되지 않습니다. 하지만 bitbang의 대부분은 예상보다 자주 마주치는 불편함에서 나왔습니다:
도달성. 원격 SSH 접근에는 인바운드 경로가 필요한데, 대부분의 네트워크에서 그것을 여는 것은 당신의 결정이 아닙니다. CGNAT(셀룰러, Starlink, 많은 ISP), 기업, 대학, 시립 네트워크 등이 그렇습니다. 그래서 실제로는 Tailscale, VPN, ngrok 같은 두 번째 시스템을 추가로 설치하게 됩니다. 또 다른 설치, 또 다른 계정, 계속 실행해야 하는 또 다른 데몬이 생깁니다. bitbang serve는 열린 포트가 필요 없으며 어디서든 동작합니다.
설정. SSH는 접속을 허용하려면 먼저 활성화하고 구성해야 합니다. Raspberry Pi OS에서는 기본적으로 비활성화되어 있고, 종종 키 전용이므로 먼저 머신에 공개 키를 넣어야 합니다. 어떻게 할까요? 이메일이나 USB 스틱이 보통 가장 간단한 방법입니다. bitbang은 대신 6자리 코드 교환으로 연결을 설정합니다. 전화로 안전하게 하거나 방 건너편에 소리쳐 전달할 수 있는 방법입니다. 또한 일반 사용자로 실행됩니다. 루트, 데몬, 설정 파일이 필요 없습니다.
프록시. 해당 머신의 네트워크에 있는 웹 앱에 접근하려면 SSH는 앱마다 별도의 터널을 미리 이름을 붙여 만들어야 합니다. bitbang 프록시는 범용적입니다. 연결 시점에 웹 앱의 URL을 지정하면 됩니다.
브라우저 클라이언트. SSH는 연결하는 쪽에 SSH 클라이언트와 키 또는 비밀번호가 필요합니다. bitbang은 브라우저만 필요합니다. 즉, 휴대폰, 빌린 노트북, 또는 터미널을 한 번도 열어본 적 없는 사람도 가능합니다. URL을 건네주면 당신이 부여한 접근 권한을 얻게 됩니다.
bitbang 사용하기모든 연결에는 두 끝이 있습니다: 리스너(접근 대상 머신에서 실행되는 bitbang serve)와 커넥터(브라우저 또는 접근하는 머신의 bitbang CLI). 하나의 리스너 URL로 두 종류의 커넥터를 모두 서빙합니다.
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
각각 QR 코드, URL, 페어링 코드를 출력합니다.
URL을 엽니다. 서빙되는 내용에 따라 다음을 얻을 수 있습니다:
nas.local, 192.168.1.10:8080, localhost:3000/admin)를 입력하고 로컬에 있는 것처럼 앱을 사용합니다. 로그인, 쿠키, 업로드, 스트리밍 모두 동작합니다.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
성공한 모든 connect 또는 페어링은 ~/.bitbang/devices.json에 저장되므로, 그 후에는 짧은 이름만으로 충분합니다: bitbang connect nas1.
한 줄 명령은 아키텍처(amd64, arm64, armv7)를 감지하고, 최신 GitHub 릴리스에서 바이너리를 다운로드한 다음, 릴리스의 checksums.txt에 대해 SHA-256을 검증하고 ~/.local/bin/bitbang에 설치합니다.
버전을 고정하거나, 위치를 변경하거나, 스크립트를 먼저 감사하려면:
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 및 Windows 빌드가 예정되어 있습니다. 각각에 대한 이슈가 생성되었습니다(macOS, windows). 반응을 달거나 글을 남겨 관심을 보여주세요. 수동 설치: Releases에서 바이너리를 다운로드하여 PATH에 넣으세요. 소스에서 빌드: 아래를 참조하세요.
bitba.ng/install은 호스팅된 스크립트가 아니라 리다이렉트입니다. 체인은 다음과 같습니다:
curl이 https://bitba.ng/install에 접속하면 이 리포지토리(main 브랜치)의 install.sh로 302 응답합니다.https://github.com/richlegrand/bitbang-cli/releases/latest/download/bitbang-linux-<arch>에서 바이너리 에셋을 다운로드합니다.checksums.txt를 가져와 바이너리의 SHA-256을 검증합니다.~/.local/bin에 설치합니다(재정의 가능).설치 스크립트는 설치하는 코드와 같은 이 리포지토리에 있습니다. 즉, 바이너리와 함께 검토할 수 있고, 표준 bitba.ng 호스트는 짧은 URL만 소유합니다. 자체 호스팅 사용자는 자신의 호스트의 /install을 자신이 배포하는 어떤 스크립트로든 지정할 수 있습니다. 시그널링 서버의 INSTALL_URL 환경 변수가 리다이렉트 대상을 제어합니다(비어 있으면 404).
bitbang은 ~/.bitbang/<program>/ 아래에 RSA 키페어를 생성합니다. 기기 UID는 공개 키에서 파생되므로, 기기를 사칭하려면 UID의 두 번째 원상을 찾아야 합니다.#…)에 있으며, 브라우저는 이를 절대 전송하지 않습니다. bitba.ng는 연결을 승인하는 자격 증명을 전혀 보지 않고 연결을 중개합니다.--pin)은 영구 또는 헤드리스 설정용이며, 휘발성 모드(-ephemeral)는 실행할 때마다 새 신원을 사용합니다.양쪽 끝이 시그널링 서버를 신뢰하지 않고 서로를 인증하는 방법은 여기에 자세히 설명되어 있습니다: 신뢰 없는 시그널링: 중앙 권한 없는 인증.
플래그는 두 형식 모두 허용합니다(-pin 또는 --pin). 불리언 플래그는 별도 표시가 없으면 기본적으로 꺼짐입니다.
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 -- 리스너 실행공용 플래그 (serve의 네 가지 형식 모두):
셸 플래그 (serve 및 serve shell):
파일 플래그:
| 형식 | 경로 | 업로드 플래그 |
|---|---|---|
serve (모든 기능) | -files PATH (기본값 cwd) | -files-upload |
(고급: -video-fd N은 상속된 소켓페어 FD를 외부 비디오 헬퍼에 전달합니다. 내부/임베딩용입니다.)
bitbang connect <target> [-- command …] -- 클라이언트 셸<target>은 다음 중 하나일 수 있습니다:
nas1; 알려진 호스트 테이블에서 확인됨 (아래 참조)482731; 페어링 흐름을 실행한 후 연결https://bitba.ng/<id>#<code>, bitba.ng/<id>#<code> 또는 id>#<code> 형태-- command가 없으면 대화형 셸을 엽니다(stdin이 터미널이면 PTY). -- command args…가 있으면 해당 단일 명령을 비대화형으로 실행하고 그 상태 코드로 종료합니다(신호 종료는 128로 보고).
bitbang cp <src> <dst> -- 파일 복사<src> / <dst> 중 정확히 하나가 원격이며 <URL>:/path 형식입니다(URL은 connect에서 허용되는 모든 형식). -는 stdin/stdout을 의미하므로 cp <URL>:/f -는 stdout으로 스트리밍하고 cp - <URL>:/f는 stdin에서 업로드합니다. 로컬 쪽의 끝에 붙는 / 또는 .은 원격 기본 이름을 유지합니다(scp 스타일).
성공한 모든 connect 또는 페어링은 ~/.bitbang/devices.json(모드 0600)에 저장되므로, URL이나 코드 대신 짧은 이름으로 다시 연결할 수 있습니다:
bitbang connect 482731 -name nas1 # pair once, save it as "nas1"
bitbang connect nas1 # thereafter, just the name
-name NAME 은 이름을 선택하며 새 호스트에만 적용됩니다. 생략하면 자동 이름(device1, device2, …)이 지정되어 출력됩니다(Saved as "device1".).-, _만 포함할 수 있습니다. 따라서 6자리 코드나 URL로 오인될 수 없습니다. 조회와 고유성은 대소문자를 구분하지 않습니다.bitbang connect nas1 -name nas2는 거부됩니다. -name은 최초 저장 전용입니다.{name, uid, access_code, server, paired_at}을 저장합니다. 알려진 호스트에 이름이나 URL로 다시 연결하면 항목이 그 자리에서 갱신되고 이름이 유지됩니다.Go 1.25+ 필요. 순수 Go, 정적 링크(CGO_ENABLED=0) -- 크로스 컴파일이 간단하며 런타임 의존성이 없습니다.
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/
현재 제공 중: 셸, 파일, 프록시 -- 브라우저 또는 CLI에서 접근 가능하며, scp 스타일 파일 복사와 저장된 기기 테이블을 이용한 임시 페어링도 포함합니다. 설계가 끝났고 진행 중인 기능:
/dev/ttyUSB0 구동 (예: 인터넷으로 Arduino IDE 실행). 이슈가 여기에 열려 있습니다.-L 5432:db.internal:5432로 LAN 전용 서비스에 접근. 이슈가 여기에 열려 있습니다.MIT -- LICENSE 참조.
이슈와 PR을 환영합니다.
| ngrok | Cloudflare Tunnel | Tailscale | bitbang |
|---|
| 계정 필요 | 예 | 예 | 예 | 아니요 |
| 연결 측 설치 | 아니요 | 아니요 | 예 | 아니요 (브라우저) |
| 종단 간 암호화 | 기본 아님 | 아니요 | 예 | 예 |
| 데이터 경로 | 그들의 서버 | 그들의 서버 | P2P | P2P |
| 자체 호스팅 서버 (오픈소스) | 아니요 | 아니요 | 아니요 (Headscale은 서드파티) | 예 |
| 첫 사용 전 설정 | 계정 + authtoken | 계정 + DNS | 계정 + 각 기기 로그인 | 명령 하나 실행 |
| 플래그 | 기본값 | 설명 |
|---|
-server HOST | bitba.ng | 시그널링 서버 호스트명 |
-pin PIN | (없음) | 연결 시 이 PIN을 요구 |
-ephemeral | 꺼짐 | 임시 신원 (실행마다 새 URL) |
-nocode | 꺼짐 | 코드 교환 페어링 비활성화 -- 6자리 코드가 발급되지 않으며 URL은 계속 동작합니다. SAS 프롬프트를 완료할 수 없는 헤드리스/비-TTY 리스너용입니다. |
-program NAME | bitbang | 신원 이름; 키페어는 ~/.bitbang/<NAME>/identity.pem에 저장됩니다 |
-target HOST:PORT | (동적) | 고정 프록시 대상 (프록시 모드); 비어 있으면 브라우저에서 대상을 선택합니다. serve proxy host:port는 이 플래그의 축약형입니다. |
-v | 꺼짐 | 상세 로깅 (브라우저 !debug 오버레이 추가) |
| 플래그 | 기본값 | 설명 |
|---|
-shell-cmd CMD | $SHELL 또는 /bin/sh | 생성할 셸 |
-shell-max-sessions N | 1 | 최대 동시 셸 세션 수 (0 = 무제한) |
-shell-mirror | 켜짐 | 셸 출력을 리스너 콘솔에 미러링 |
serve files [PATH] | 위치 인자 PATH (기본값 cwd) | -upload |
| 플래그 | 기본값 | 설명 |
|---|
-name NAME | (자동) | 이 호스트를 NAME으로 기억합니다 (새 호스트만 해당; 생략하면 device<N> 자동 지정) |
-relay | 꺼짐 | 폴백시에만 사용하는 대신 처음부터 TURN 릴레이를 요청합니다 (ICE는 성공하면 여전히 직접 경로를 선호) |
-pin PIN | (프롬프트) | 리스너가 PIN을 요구할 때 보낼 PIN (대화형 프롬프트 건너뜀) |
-timeout DUR | 30s | 다이얼 타임아웃 (예: 45s, 1m) |
-server HOST | bitba.ng | 시그널링 서버 -- 페어 코드 모드 전용; URL 형식은 자체 호스트를 포함합니다 |
-v | 꺼짐 | 상세 로깅 |
| 플래그 | 기본값 | 설명 |
|---|
-relay | 꺼짐 | 처음부터 TURN 릴레이 요청 (connect와 동일) |
-pin PIN | (프롬프트) | 필요한 경우 보낼 PIN |
-timeout DUR | 30s | 다이얼 타임아웃 |
-v | 꺼짐 | 상세 로깅 |