
bitbang-cli v0.5.0
포트 포워딩이나 계정 없이 브라우저 또는 CLI를 사용하여, 종단 간 암호화된 피어투피어 WebRTC를 통해 대화형 셸, 파일 전송, 웹 프록시를 제공하는 머신에 대한 안전한 원격 접속을 설정합니다.
BitBang CLI
bitbang은 단일 정적 바이너리로 제공되는 원격 접근 멀티툴입니다. 어떤 브라우저에서든 원격 머신에 대한 대화형 셸과 파일 브라우저에 접근할 수 있습니다. 또한 해당 머신의 네트워크에 있는 웹 앱에도 접근할 수 있습니다. 브라우저 외에도 TCP 포트 포워딩, 파일 복사, 터미널 공유를 지원합니다. 계정이나 설정이 필요 없으며, 그냥 실행하면 됩니다.

접근하려는 머신에서:``` curl -sSfL bitba.ng/install | sh bitbang serve
`serve`는 URL을 출력합니다. 아무 브라우저에서나 열면 터미널, 파일 브라우저, 그리고 해당 머신의 네트워크에 대한 프록시를 얻을 수 있습니다. 또는 다른 터미널에서 `bitbang connect <url>`로 같은 머신에 접속할 수 있으며, 이는 포트 포워딩(`-L`)과 파일 복사(`bitbang cp`)를 추가합니다. 연결은 종단 간 암호화되고 P2P 방식입니다. `bitba.ng` 서버는 양쪽 끝을 소개한 후 물러납니다.
`bitbang`은 단일 정적 Go 바이너리입니다. [BitBang 프로젝트](https://github.com/richlegrand/bitbang)의 일부이며, 이 [백서](https://github.com/richlegrand/bitbang/blob/main/whitepaper.md)에서 설계를 자세히 다룹니다.
## 비교
| | ngrok | Tailscale | `bitbang` |
| ------------------------------ | ---------------------- | ------------------------------ | ------------------- |
| 첫 사용 전 설정 | 계정 + authtoken | 계정 + 각 기기에서 로그인 | **명령 하나 실행** |
| 무언가를 공유하려면 실행하는 것 | 웹 서버 + ngrok | 양쪽 머신에 클라이언트 | **`bitbang serve`** |
| 원격 브라우저가 받는 것 | 이미 실행 중이던 웹 서버 | 없음 -- 클라이언트가 필요함 | **원격 네트워크의 터미널, 파일 브라우저, 웹 앱** |
| 데이터 경로 | 그들의 서버 | P2P (릴레이 폴백) | **P2P (릴레이 폴백)** |
| 종단 간 암호화 | 기본적으로 아님 | 예 | **예** |
## 빠른 레시피
**집에 있는 서비스에 접속하기**
- [어디서나 집 NAS 마운트하기 (SMB)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#mount-your-home-nas-from-anywhere-smb)
- [어디서나 미디어 라이브러리 시청하기 (Jellyfin)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#watch-your-media-library-from-anywhere-jellyfin)
- [어디서나 자체 LLM 사용하기 (Ollama, Open WebUI)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#use-your-own-llm-from-anywhere-ollama-open-webui)
- [보안 카메라 확인하기 (Frigate)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#check-your-security-cameras-frigate)
- [노출 없이 홈 자동화에 접속하기 (Home Assistant)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#reach-your-home-automation-without-exposing-it-home-assistant)
- [집 프린터로 인쇄하기 (IPP, CUPS)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#print-to-your-home-printer-ipp-cups)
**머신에 접속하기**
- [NAT 뒤의 머신에서 셸 얻기](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#get-a-shell-on-a-machine-behind-nat)
- [휴대폰에서 셸 얻기](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#get-a-shell-from-your-phone)
- [Windows 머신에 원격 데스크톱 접속 (RDP)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#remote-desktop-into-a-windows-machine-rdp)
- [Linux 또는 Mac 데스크톱 접속 (VNC)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#reach-a-linux-or-mac-desktop-vnc)
- [열린 포트가 없는 머신에 SSH 접속 (OpenSSH)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#ssh-to-a-machine-with-no-open-port-openssh)
- [헤드리스 Raspberry Pi 설정하기](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#set-up-a-headless-raspberry-pi)
**다른 사람과 공유하기**
공유는 단순히 고유한 URL이나 QR 코드를 상대방에게 주는 것으로, 이를 통해 접근 권한을 부여합니다. 권한은 맞춤 설정할 수 있으며 몇 분, 몇 시간 등으로 만료되도록 설정할 수 있습니다.
- [파일을 어디에도 업로드하지 않고 공유하기](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#share-files-without-uploading-them-anywhere)
- [프로젝트를 누군가에게 보여주기](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#show-someone-your-project)
- [만료되는 접근 권한 부여하기](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#give-someone-access-that-expires)
- [휴대폰에서 에이전트 세션 확인하기 (Claude Code, tmux)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#check-your-agent-session-from-your-phone-claude-code-tmux)
- [다른 사람의 라우터 고치기](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#fix-someone-elses-router)
**개발 및 기기**
- [개발 머신에서 데이터베이스 접속 (Postgres, MySQL)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#reach-a-database-from-your-dev-machine-postgres-mysql)
- [서로를 찾지 못하는 기기 동기화 (Syncthing)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#sync-devices-that-cannot-find-each-other-syncthing)
- [브라우저에서 로봇 보기 (ROS, Foxglove)](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#watch-a-robot-from-a-browser-ros-foxglove)
**기법**
- [포워딩 리스너가 노출하는 것](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#what-a-forwarding-listener-exposes)
- [LAN의 다른 머신이 포워드를 사용하게 하기](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#let-other-machines-on-your-lan-use-a-forward)
- [작동하지 않는 것으로 알려진 것](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#known-not-to-work)
## `bitbang` 사용하기
모든 연결에는 두 개의 끝이 있습니다: **리스너**(접속 대상 머신에서 실행되는 `bitbang serve`)와 **커넥터**(접속하는 머신의 브라우저 또는 `bitbang` CLI)입니다. 하나의 리스너 URL이 두 종류의 커넥터를 모두 지원합니다.
### 리스너: `bitbang serve````
bitbang serve # everything: shell + proxy + files + forward
bitbang serve shell # just a terminal
bitbang serve files ~/share # just a directory (-files-upload to allow uploads)
bitbang serve proxy localhost:8080 # just one web app, straight at the URL
bitbang serve proxy a.lan:80,b.lan:80 # ...or several, chosen in the browser
bitbang serve forward 127.0.0.1:22 # just TCP, for `connect -L`
bitbang serve shell files ~/share proxy nas.lan:8096 # any combination
각각은 QR 코드, URL 및 페어링 코드를 출력합니다. 모드는 리스너가 수행할 수 있는 작업을 결정합니다. serve shell은 전달할 포워딩이 없으며, 포워딩 전용 리스너는 셸을 시작하지 않으므로 권한을 상승시킬 대상이 없습니다.
알아두면 유용한 기본값 하나: 포워딩과 프록시는 리스너가 도달할 수 있는 모든 호스트:포트에 연결할 수 있습니다. 의도한 대상뿐만 아니라, 데이터베이스용으로 배포된 링크는 해당 네트워크의 나머지 부분에도 도달할 수 있습니다. 대상 이름을 단어 뒤에 지정하면 범위가 좁아집니다. forward db.internal:5432는 해당 대상에만 연결되고 다른 곳에는 연결되지 않습니다.
실행 중인 세션 공유: bitbang share
serve shell은 새 셸을 시작합니다. share는 이미 실행 중인 tmux 세션을 게시합니다.```
bitbang share # publish the current tmux session
bitbang share --read-only # publish without a control URL
bitbang share status|stop|rotate
The command returns after publishing, so `Ctrl-Z`, `bitbang share`, `fg`
works for a task already in progress. Hosting requires tmux 3.2+ on Unix or
WSL. Native Windows clients can open the URLs but cannot host a share.
By default, the command prints two bearer URLs:
- The **Control URL** can type with the same authority as the local keyboard.
One controller may connect at a time.
- The **View URL** is watch-only. Input is dropped before it reaches tmux, and
up to `--max-viewers` viewers may connect at once (default 16).
`--read-only` omits the control credential entirely. Viewer and controller
limits are held for each connection's lifetime, even before it opens a shell.
Shares run until stopped by default; `--ttl` sets a lifetime (e.g. `--ttl 1h`).
Share URLs are ephemeral and are never saved to `devices.json`. `share stop`,
TTL expiry, or removal of the source session disconnects remote peers without
stopping the source session.
Re-running `bitbang share` reprints the running share's URLs. If you
pass a flag that disagrees with what is running (say `--read-only`
against a share that has a control URL), it says so rather than
handing back the old URLs; `bitbang share rotate` replaces the share
with one that uses the new flags.
A background worker runs in a detached `_bbshare_*` tmux management session,
so there is no daemon or PID file to manage.
Sharing changes no tmux options. With tmux's default `window-size latest`, the
window follows the active read-write client; a lone viewer still supplies the
only available size. If `window-size` has been overridden, `share` reports it
but does not change the user's configuration.
### Handing out limited access: `bitbang link`
One listener, one URL, and as many **access links** as you need. Each is a
separate code on that same URL, granting a subset of what the listener offers
and optionally lapsing at a fixed time:```
bitbang link edit # add entries in $EDITOR
bitbang link ls # what you have handed out
bitbang link rm <label> # revoke one
bitbang link qr <label> # its URL and QR code
An entry is a line of JSON in ~/.bitbang/bitbang/links.json. Write one with no
code, reload the listener at its console, and it mints one:```json
[
{"label": "ana", "grant": "files", "expires": "2026-09-01T00:00:00Z"},
{"label": "ben", "grant": "files /srv/photos"},
{"label": "dev", "grant": "shell forward 127.0.0.1:5432"}
]
I need the actual content of chunk 11 to translate it. Please provide the Markdown text you'd like translated.```
0) owner files forward proxy shell
https://bitba.ng/8ach_I7oQk2vBb9xYzT0Lw#_vtQ0JCPe7s
1) ana files expires in 6d
https://bitba.ng/8ach_I7oQk2vBb9xYzT0Lw#T-Ty_HhvLfY
2) ben files /srv/photos
https://bitba.ng/8ach_I7oQk2vBb9xYzT0Lw#L6La8OzBO74
3) dev forward 127.0.0.1:5432 shell
https://bitba.ng/8ach_I7oQk2vBb9xYzT0Lw#8kmI3LYzB7E
owner는 신원 자체의 코드로, 리스너가 제공하는 모든 것을 부여합니다. 대신 다른 코드 중 하나를 보내세요. 콘솔은 라벨이나 옆에 있는 숫자 중 아무거나 받으므로, rm 2와 rm ben은 같은 작업을 수행합니다.
grant는 serve가 받는 단어로 작성되며, 리스너가 이미 제공하는 것만 좁힐 수 있습니다. 즉, 링크는 기능을 선택하는 데 제한되지 않습니다. 공유 폴더의 하위 디렉터리, 전달 대상의 하위 집합, 또는 shell의 단일 명령을 지정할 수 있습니다. grant를 생략하면 링크는 리스너가 제공하는 모든 것을 부여합니다. 리스너의 범위를 벗어난 것을 요청하면 콘솔은 serve가 주는 것과 동일한 메시지로 거부합니다.
라벨은 링크를 식별하는 것이지 그 조건이 아니므로, 두 사람이 동일한 grant와 만료 시간을 가진 링크를 보유해도 다른 하나에 영향을 주지 않고 하나만 취소할 수 있습니다.
취소와 만료는 이미 열려 있는 세션에도 도달합니다. 연결이 닫히고 보유자에게 이유가 전달되며, 조용히 끊기지 않습니다. 그리고 만료된 코드는 일시 중지가 아니라 폐기됩니다. 항목을 갱신하면 새 코드가 생성되므로, 이미 보낸 URL은 계속 죽은 상태로 유지됩니다.
6자리 코드로 페어링
URL을 붙여넣거나 QR 코드를 스캔할 수 없을 때(예: 전화 통화 중이거나 소리 지를 수 있는 거리 안에 있을 때), bitbang serve는 짧은 페어링 코드도 출력합니다. 상대방은 bitba.ng/<code>를 열거나(또는 bitbang connect <code>를 실행), 화면에 두 번째 6자리 숫자가 표시되며, 그 숫자를 다시 읽어서 알려줍니다. 승인하려면 그 숫자를 입력하세요. 중간자 공격은 두 숫자를 일치시킬 수 없으며, 페어링은 다음 번을 위해 장치 연결 자격 증명을 저장합니다(예: bitbang connect nas1). Magic Wormhole을 알고 있다면, 형태가 비슷합니다. 두 머신을 안전하게 소개하는 음성 코드입니다.

자체 TURN 사용
대부분의 연결은 직접 피어 투 피어로 진행됩니다. 양쪽 끝이 홀 펀칭이 되지 않는 NAT 뒤에 있을 때, 트래픽은 릴레이가 필요하며, 기본적으로는 우리의 릴레이를 사용합니다. -ice-servers는 리스너를 자체 서버로 지정합니다:```
bitbang serve -ice-servers ~/turn.json
리스너는 등록 시 신호 서버에 구성을 전달하고, 서버는 연결하는 모든 쪽에 이를 제공합니다. 따라서 양쪽 끝 모두 사용자의 릴레이를 사용하며, 우리 쪽은 전혀 관여하지 않습니다. coturn이든 Cloudflare나 Twilio 같은 호스팅 제공업체든 무엇이든 작동합니다.
파일은 JSON이며, 제공업체가 전달한 다음 세 가지 형태 중 하나를 따릅니다.```json
[{"urls": ["turn:turn.example.net:3478"], "username": "user", "credential": "pass"}]
2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.```json
{"ice_servers": [{"urls": "stun:stun.example.net:3478"}]}
I'm ready to translate the Kitploit tool content from English to Korean. Please provide chunk 19 of 35.```json
{"iceServers": [{"urls": ["turn:turn.example.net:3478"], "username": "u", "credential": "p"}]}
urls는 문자열 또는 목록을 받습니다. username과 credential은 TURN용이며 STUN 전용 항목에서는 생략할 수 있습니다. 경로는 절대 경로, 상대 경로 또는 ~로 시작하는 경로일 수 있습니다. 파싱되지 않는 파일은 조용히 폴백하는 대신 시작 시 리스너를 중지시킵니다.
세션이 요청 없이 릴레이로 전환되면 bitbang connect는 왜 느린지 궁금해하게 두지 않고 그 사실을 알려줍니다. 리스너는 어느 쪽이든 (via RELAY로) 기록하며, 경로를 진단할 때 -relay / -norelay로 해당 문제를 강제로 지정할 수 있습니다.
짚고 넘어갈 점: 이는 누가 바이트를 운반하는지에 대한 것이지, 누가 읽을 수 있는지에 대한 것이 아닙니다. 릴레이는 우리 것을 포함해 DTLS 암호문만 볼 수 있습니다. 우리가 제공하는 것보다 더 많은 TURN이 필요하면 직접 실행하세요 (현재 시간 제한이 있습니다).
브라우저에서 연결하기
URL을 엽니다. 제공되는 내용에 따라 다음을 얻을 수 있습니다:
- Shell -- 페이지 내 전체 터미널 (색상, 크기 조정, 복사/붙여넣기).
- Files -- 탐색, 미리보기, 다운로드 및 업로드.
- Proxy -- LAN 주소(
nas.local,192.168.1.10:8080,localhost:3000/admin)를 입력하고 로컬에 있는 것처럼 앱을 사용합니다. 로그인, 쿠키, 업로드 및 스트리밍이 모두 작동합니다.
CLI에서 연결하기```
bitbang connect # interactive shell bitbang connect -- tail -f /var/log/syslog # one-shot command bitbang connect -L 15432:db.internal:5432 # local TCP forwarding bitbang connect -L 14450:nas.local:445 -L 15900:[fd00::20]:5900 bitbang cp :/var/log/app.log ./app.log # copy files, scp-style bitbang cp - :/tmp/firmware.bin < firmware.bin # stdin/stdout work too
`-L`는 `ssh -L`처럼 **TCP만** 전달합니다. `-L`은 `-g`를 전달하지 않는 한 `127.0.0.1`에 바인딩되며, `-g`를 전달하면 전달된 포트가 로컬 네트워크에서 접근 가능해집니다. 그리고 그 포트에 도달하는 사람은 누구든 터널이 도달하는 대상에 접근하게 되며, 그 앞에는 BitBang 자격 증명이 없습니다.
리스너는 `bitbang serve forward` 또는 `bitbang serve`가 필요합니다. 기본적으로 `forward` 링크는 의도한 호스트:포트뿐만 아니라 **리스너가 도달할 수 있는 모든 호스트:포트에** 도달하므로, 데이터베이스용으로 배포된 링크는 해당 네트워크의 나머지 부분에도 도달할 수 있습니다. 도달할 수 있는 대상을 지정하여 범위를 좁히세요:```
bitbang serve forward db.internal:5432 # this link reaches one service
모든 성공적인 연결 또는 페어링은 ~/.bitbang/devices.json에 저장되므로, 이후에는 짧은 이름만으로 충분합니다: bitbang connect nas1.
플랫폼 지원
플랫폼당 하나의 바이너리, 런타임 의존성 없음. 아래에 명시된 두 행을 제외하고 모든 곳에서 작동합니다.
| Linux | macOS | Windows | |
|---|---|---|---|
셸, 파일, 프록시 (bitbang serve) | yes | yes | yes |
TCP 포워딩 (-L) | yes | yes | yes |
| 액세스 링크 -- 부여, 만료, 취소 | yes | yes | yes |
| 자체 TURN 사용 | yes | yes | yes |
| 6자리 코드로 페어링 | yes | yes | yes |
| 리스너 콘솔 (Enter) | yes | yes | yes |
bitbang connect, bitbang cp | yes | yes | yes |
| 공유 세션 보기 | yes | yes | yes |
공유 호스팅 (bitbang share) | yes | yes | no * |
| 연결 중 터미널 크기 조정 | yes | yes | no ** |
* bitbang share는 tmux 세션을 게시하므로 호스팅하려면 tmux가 필요합니다 -- Linux, macOS 또는 WSL. 네이티브 Windows에서도 bitbang connect로 공유 URL을 열 수 있습니다.
** Windows 커넥터는 터미널 크기 조정을 인식하지 못하므로, 원격 셸은 재연결할 때까지 시작 시의 크기를 유지합니다. Unix는 SIGWINCH로 이를 감지하지만, Windows에는 이에 해당하는 기능이 없습니다.
보안
- 자가 인증 신원. 첫 실행 시
bitbang은~/.bitbang/<program>/아래에 RSA 키페어를 생성합니다. 장치 UID는 공개 키에서 파생되므로, 장치를 사칭하려면 해당 UID의 두 번째 선이미지를 찾아야 합니다. - 비밀은 서버에 닿지 않습니다. 액세스 코드는 URL 프래그먼트(
#…)에 있으며, 브라우저는 이를 절대 전송하지 않습니다 --bitba.ng는 연결을 중개할 뿐, 이를 승인하는 자격 증명을 절대 보지 못합니다. - 종단 간 암호화. 모든 트래픽은 WebRTC의 DTLS를 사용합니다. 시그널링 서버는 공개 키, 파생된 UID, 연결 메타데이터만 볼 뿐 -- 데이터는 절대 보지 못합니다. TURN 릴레이가 필요한 경우에도 암호문만 볼 수 있습니다.
- 검증된 페어링. 코드 페어링에서 소리 내어 읽는 숫자는 짧은 인증 문자열(SAS)로, 협상된 DTLS 지문과 두 개의 커밋된 논스에서 양쪽 끝에서 독립적으로 계산됩니다 -- 지문이 필연적으로 다른 중간자(MITM)는 두 숫자를 일치시킬 수 없습니다.
- URL은 전달자 자격 증명입니다. 이를 가진 사람은 누구나 당신이 제공하기로 선택한 것 --
serve shell을 실행했다면 셸 -- 을 얻을 수 있습니다. 이에 따라 공유하세요. - 선택적 PIN (
--pin)은 영구 또는 헤드리스 설정용이며, 일회용 모드 (-ephemeral)는 실행마다 새 신원을 생성합니다. - 서버가 여전히 보는 것. 아무것도 아닌 것은 아닙니다. 서버는 소개를 중개하므로 양쪽 끝의 IP 주소, 연결 시점, 교환량을 관찰합니다. 종단 간 암호화는 데이터를 보호하지만, 그 주변의 메타데이터까지는 보호하지 않습니다 -- 최소 신뢰가 무신뢰보다 더 정확한 표현입니다.
- 브라우저는 로드한 페이지를 신뢰합니다. 브라우저 클라이언트는 시그널링 서버가 제공하는 JavaScript이므로, URL을 여는 것은 해당 서버가 정직한 코드를 제공한다고 신뢰하는 것을 의미합니다.
bitbang connect에는 그러한 의존성이 없습니다: 이는 당신이 설치하고 체크섬을 확인한 바이너리입니다. 그 차이가 중요하다면 CLI로 연결하세요.
양쪽 끝이 서로를 인증하여 시그널링 서버가 연결에 개입할 수 없게 하는 방법은 여기에 자세히 설명되어 있습니다: 무신뢰 시그널링: 중앙 기관 없는 인증.
왜?
- 열거나 구성할 것이 없습니다. NAT, CGNAT 또는 잠긴 네트워크 뒤에서도 작동합니다 -- 라우터 변경, VPN, 터널 데몬이 필요 없습니다.
- 연결 측에 설치할 것이 없습니다. 브라우저만으로 충분합니다. 스크립팅, 파이프, 파일 복사가 필요할 때는 CLI가 있습니다.
- 설계상 프라이빗. 트래픽은 WebRTC/DTLS, 피어 투 피어입니다. 시그널링 서버는 이를 절대 보지 못합니다. 직접 경로가 불가능하면 TURN 릴레이가 암호문만 전달합니다.
- 계정 없음, 텔레메트리 없음.
그냥 SSH를 쓰면 안 되나요? 아니면 Tailscale?
짧은 답변: 이미 SSH로 접속할 수 있는 머신이거나, 설치할 수 있는 자체 장치 플릿이라면 기존 도구를 계속 사용하세요. bitbang은 상대방이 장치가 아닌 사람일 때, 또는 현재 위치에서 아무것도 설치할 수 없을 때를 위한 것입니다. 두 질문 모두 **FAQ**에서 자세히 다룹니다.
설치```
curl -sSfL bitba.ng/install | sh
Linux 및 macOS. OS와 아키텍처(`amd64`, `arm64`, Linux의 경우 `armv7`)를 감지하여 최신 [GitHub release](https://github.com/richlegrand/bitbang-cli/releases)에서 바이너리를 다운로드하고, 릴리스의 `checksums.txt`와 SHA-256을 대조한 후 `~/.local/bin/bitbang`에 설치합니다.
Windows 빌드는 `bitbang-windows-amd64.exe` 및
`bitbang-windows-arm64.exe`로 게시됩니다. Releases에서 적절한 바이너리를
다운로드하여 `bitbang.exe`로 이름을 바꾸고 `PATH`에 배치하세요.
**소스에서 빌드:** [아래](#building-from-source)를 참조하세요.
**macOS 및 Gatekeeper.** 위의 원라인 설치 명령은 영향을 받지 않습니다. `curl`은
`com.apple.quarantine` 속성을 설정하지 않으므로 가져온 바이너리가 정상적으로
실행됩니다. 대신 브라우저에서 Releases 페이지의 `bitbang-darwin-arm64`를
다운로드하면 macOS가 이를 격리하고 열기를 거부합니다. 릴리스 바이너리는
공증(notarized)되지 않았기 때문입니다. 다음 중 하나로 해제하세요:```
xattr -d com.apple.quarantine ./bitbang-darwin-arm64
또는 Finder에서 파일을 마우스 오른쪽 버튼으로 클릭하고 열기를 선택하면 일회성 재정의가 제공됩니다. 또는 소스에서 빌드하면 격리되지 않습니다.
Windows 및 SmartScreen. Windows에서도 같은 이유로 동일한 현상이 발생합니다. 브라우저 다운로드는 Mark-of-the-Web을 첨부하므로 첫 실행 시 *"Windows에서 PC를 보호했습니다"*가 표시됩니다. 추가 정보를 선택한 다음 그래도 실행을 선택하세요. 릴리스 바이너리는 코드 서명되지 않았으므로 이는 문제가 있다는 신호가 아니라 예상된 동작입니다. curl 또는 PowerShell의 Invoke-WebRequest로 .exe를 가져오면 첨부되지 않으며, 소스에서 빌드해도 마찬가지입니다.
설치 옵션
버전을 고정하거나, 위치를 변경하거나, 실행 전에 스크립트를 읽어보세요:``` curl -sSfL bitba.ng/install | sh -s -- --version 0.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
릴리스 태그에는 `v` 접두사가 없습니다(`0.5.0`이지 `v0.5.0`이 아닙니다).
### 설치 URL 작동 방식
`bitba.ng/install`은 호스팅된 스크립트가 아니라 리다이렉트입니다. 체인은 다음과 같습니다:
1. `curl`이 `https://bitba.ng/install`에 접속하면, 이 저장소(`main` 브랜치)의 [`install.sh`](https://github.com/richlegrand/bitbang-cli/blob/HEAD/install.sh)로 302 리다이렉트됩니다.
2. 스크립트가 셸에서 실행되어 OS+아키텍처를 감지하고, `https://github.com/richlegrand/bitbang-cli/releases/latest/download/bitbang-linux-<arch>`에서 바이너리 자산을 다운로드합니다.
3. 동일한 릴리스에서 `checksums.txt`를 가져와 바이너리의 SHA-256을 검증합니다.
4. `~/.local/bin`에 설치합니다(재정의 가능).
설치 스크립트는 설치하는 코드와 함께 이 저장소에 있으므로, 바이너리와 함께 검토할 수 있으며, 표준 bitba.ng 호스트는 짧은 URL만 소유합니다. 자체 호스팅 사용자는 자신의 호스트의 `/install`을 배포하는 스크립트로 지정할 수 있습니다: 시그널링 서버의 `INSTALL_URL` 환경 변수가 리다이렉트 대상을 제어합니다(비어 있으면 → 404).
## 명령어 참조
모든 하위 명령어와 플래그는 **[CLI.md](https://github.com/richlegrand/bitbang-cli/blob/HEAD/CLI.md)**에 있으며, `bitbang <command> --help`는 터미널에서 동일한 내용을 출력합니다.
## 소스에서 빌드하기
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/
Windows 명령 프롬프트에서:```bat go build -o bitbang.exe .\cmd\bitbang go test .... run_tests.cmd unit
셸 명령, 파일 공유, 프록시, CLI 클라이언트는 Windows에서 지원됩니다.
대화형 브라우저 및 CLI 셸은 Windows ConPTY를 사용하며, 터미널 입력 에코, 줄 편집, VT 출력, 크기 조정 이벤트를 포함합니다. ConPTY는 Windows 10 버전 1809 또는 Windows Server 2019 이상이 필요합니다.
## 다이어그램
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/47068/d68fcddad62ab84f11a549906a2b5abf2330fb25f39b3c1a1266eac7257a080d.png" alt="bitbang CLI 셸 및 파일 공유" width="760">
<img src="https://assets.kitploit.com/production/public/readmes/47068/55bb6866c22504a6434e3dee8cb998e747cd73cb9d0bfa5e0bc0ede7b90ce262.png" alt="bitbang CLI 프록시 작동" width="720">
</p>
## 로드맵
현재 제공 중: **셸, 파일, 프록시** — 브라우저 또는 CLI에서 접근 가능하며, **TCP 포트 포워딩**, scp 스타일 파일 복사, 저장된 장치 테이블을 통한 **임시 페어링**, **터미널 공유**(`bitbang share`), 그리고 URL이 부여하는 권한을 축소하고 만료시키는 **액세스 링크**(`bitbang link`)도 포함됩니다. 설계 완료 및 진행 중:
- **직렬 브리징** — 로컬 가상 포트에서 원격 `/dev/ttyUSB0` 구동 (예: 인터넷을 통해 Arduino IDE 실행). 이슈가 [여기](https://github.com/richlegrand/bitbang-cli/issues/3)에 등록되었습니다.
- **원격 데스크톱** — WebRTC 비디오 트랙을 통한 화면, 데이터 채널을 통한 키보드/마우스.
## 라이선스
MIT — [LICENSE](https://github.com/richlegrand/bitbang-cli/blob/HEAD/LICENSE) 참조.
## 기여
이슈와 PR은 언제나 환영합니다.
레시피는 다릅니다: 레시피는 [bitbang](https://github.com/richlegrand/bitbang) 저장소의 [cookbook](https://github.com/richlegrand/bitbang/blob/main/cookbook.md)에 있으며, 이 프로젝트가 아닌 모든 프로젝트에 걸쳐 있기 때문입니다. 레시피 추가는 해당 저장소에서 PR로 진행됩니다.
*목록에 등재*하는 것은 각 프로젝트별로 별도의 작은 PR이 필요하며, 해당 README에 표시해야 합니다 — 위의 [레시피](#recipes) 목록은 여기에서 수동으로 유지 관리됩니다. 이는 의도적인 것입니다: 각 프로젝트가 자체 독자에게 어떤 레시피를 보여줄 가치가 있는지 결정하며, 모든 README에 모든 레시피를 추가하지 않기 위함입니다.