Назад к обновлениям
New releaseSep 2, 2026

bitbang-cli v0.5.0

Установите безопасный удалённый доступ к машине с интерактивной оболочкой, передачей файлов и веб-прокси через сквозное шифрование peer-to-peer WebRTC, используя браузер или CLI без проброса портов и учётных записей.

Поделиться

BitBang CLI

Tests License

bitbang — это единый статический бинарный мультиинструмент удалённого доступа. Из любого браузера: интерактивная оболочка и доступ к файловому браузеру на удалённой машине. Также можно обращаться к веб-приложениям в сети этой машины. Помимо браузера, он поддерживает переадресацию TCP-портов, копирование файлов и совместное использование терминала. Для работы не требуется учётная запись или настройка — он просто работает.

Установите bitbang, запустите bitbang serve и откройте выведенный URL в браузере, чтобы получить оболочку, файловый браузер и прокси к сети машины

На машине, к которой вы хотите получить доступ:``` curl -sSfL bitba.ng/install | sh bitbang serve

`serve` выводит URL. Откройте его в любом браузере — и вы получите терминал, файловый браузер и прокси к сети этой машины — или подключитесь к той же машине из другого терминала с помощью `bitbang connect <url>`, что добавляет проброс портов (`-L`) и копирование файлов (`bitbang cp`). Соединение сквозное зашифровано и работает по принципу peer-to-peer; сервер `bitba.ng` знакомит два конца друг с другом, а затем отходит в сторону.

`bitbang` — это один статический Go-бинарник. Он является частью [проекта BitBang](https://github.com/richlegrand/bitbang); этот [whitepaper](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)

**Доступ к машине**

- [Получите shell на машине за NAT](https://github.com/richlegrand/bitbang/blob/main/cookbook.md#get-a-shell-on-a-machine-behind-nat)
- [Получите shell с телефона](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)
- [Настройте headless 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`, запущенный на машине, к которой обращаются) и **коннектор** (браузер или CLI `bitbang` на машине, которая обращается). Один 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

Команда возвращается после публикации, поэтому `Ctrl-Z`, `bitbang share`, `fg`
работают для уже запущенной задачи. Для хостинга требуется tmux 3.2+ на Unix или
WSL. Нативные клиенты Windows могут открывать URL-адреса, но не могут размещать общий доступ.

По умолчанию команда выводит два bearer URL:

- **Control URL** может вводить текст с теми же правами, что и локальная клавиатура.
  Одновременно может подключиться один контроллер.
- **View URL** — только для просмотра. Ввод отбрасывается до того, как он достигнет tmux, и
  одновременно может подключиться до `--max-viewers` зрителей (по умолчанию 16).

`--read-only` полностью исключает учётные данные контроллера. Ограничения для зрителей и контроллеров
действуют в течение всего времени жизни каждого подключения, даже до открытия оболочки.

Общие ресурсы работают до остановки по умолчанию; `--ttl` задаёт время жизни (например, `--ttl 1h`).
URL-адреса общих ресурсов эфемерны и никогда не сохраняются в `devices.json`. `share stop`,
истечение TTL или удаление исходной сессии отключает удалённых пиров без
остановки исходной сессии.

Повторный запуск `bitbang share` повторно выводит URL-адреса запущенного общего ресурса. Если вы
передаёте флаг, который не соответствует тому, что запущено (скажем, `--read-only`
для общего ресурса, у которого есть control URL), он сообщает об этом, а не
возвращает старые URL-адреса; `bitbang share rotate` заменяет общий ресурс
на тот, который использует новые флаги.

Фоновый рабочий процесс запускается в отсоединённой управляющей сессии tmux `_bbshare_*`,
поэтому нет демона или PID-файла для управления.

Общий доступ не изменяет никаких параметров tmux. При значении tmux по умолчанию `window-size latest` окно
следует за активным клиентом чтения-записи; одинокий зритель всё равно предоставляет
единственный доступный размер. Если `window-size` был переопределён, `share` сообщает об этом,
но не изменяет конфигурацию пользователя.

### Предоставление ограниченного доступа: `bitbang link`

Один слушатель, один URL и столько **ссылок доступа**, сколько вам нужно. Каждая из них — это
отдельный код на том же URL, предоставляющий подмножество того, что предлагает слушатель,
и при желании истекающий в заданное время:```
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

Запись — это строка JSON в ~/.bitbang/bitbang/links.json. Напишите одну без кода, перезагрузите слушатель в его консоли, и он создаст одну:```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"} ]

## Установка

### Требования

- Python 3.8 или выше
- pip (менеджер пакетов Python)

### Установка из PyPI

```bash
pip install kitploit

Установка из исходного кода

git clone https://github.com/kitploit/kitploit.git
cd kitploit
pip install -r requirements.txt
python setup.py install

Проверка установки

kitploit --version

Если вы видите номер версии, установка прошла успешно.``` 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`.

Метка — это то, что идентифицирует ссылку, а не её условия, поэтому два человека могут держать ссылки
с одинаковыми правами и сроком действия, и вы всё равно сможете отозвать одну, не затрагивая
другую.

Отзыв и истечение срока действия достигают уже открытых сессий: соединение закрывается,
и держателю сообщается причина, а не просто обрывается связь. А истёкший код
снимается с использования, а не приостанавливается — продление записи создаёт новый код, поэтому URL,
который вы уже отправили, остаётся нерабочим.

### Сопряжение с 6-значным кодом

Когда вы не можете вставить URL или отсканировать QR-код, например, когда вы разговариваете по телефону или находитесь на расстоянии окрика, `bitbang serve` также выводит короткий **код сопряжения**. Другая сторона открывает `bitba.ng/<code>` (или запускает `bitbang connect <code>`), на её экране появляется второе 6-значное число, и она зачитывает *это* число вам. Вы вводите его для подтверждения. Атакующий в середине не может заставить два числа совпасть, а сопряжение сохраняет учётные данные подключения устройства для следующего раза, например, `bitbang connect nas1`. Если вы знакомы с [Magic Wormhole](https://github.com/magic-wormhole/magic-wormhole), схема похожа — произносимый код, который безопасно знакомит две машины.

![Сервер выводит 5-минутный код сопряжения; другая сторона вводит его на bitba.ng, на её экране появляется 6-значный вызов для чтения вслух, и ввод его на обслуживающей машине подтверждает подключение](https://assets.kitploit.com/production/public/readmes/47068/a5df368669e25ce461cc712a7c83d5dc41459c94a2f8281992ae695f4543223b.webp)

### Свой собственный TURN

Большинство соединений идут напрямую peer-to-peer. Когда оба конца находятся за NAT, который
не пробивает дыры, трафику нужен ретранслятор, и по умолчанию это наш. `-ice-servers`
указывает слушателю на ваш собственный вместо этого:```
bitbang serve -ice-servers ~/turn.json

Слушатель передаёт конфигурацию сигнальному серверу при регистрации, и сервер отдаёт её тому, кто подключается — так что оба конца используют ваш ретранслятор, а наш в этом не участвует. Подойдёт любой coturn или хостинг-провайдер вроде Cloudflare или Twilio.

Файл — это JSON, в одной из этих трёх форм, которую вам выдал ваш провайдер:```json [{"urls": ["turn:turn.example.net:3478"], "username": "user", "credential": "pass"}]

🚀 Быстрый старт

Установка

git clone https://github.com/example/tool.git
cd tool
pip install -r requirements.txt

Использование

python tool.py --target example.com --output results.txt

Пример вывода

[+] Сканирование example.com
[+] Найдено 3 открытых порта
[+] Отчет сохранен в results.txt

📚 Документация

Полная документация доступна в Wiki.

🤝 Вклад

Мы приветствуем вклад сообщества! Пожалуйста, ознакомьтесь с CONTRIBUTING.md перед отправкой pull request.

📄 Лицензия

Этот проект распространяется под лицензией MIT. Подробности см. в файле LICENSE.

📧 Контакты

По вопросам и предложениям обращайтесь: [email protected]

🙏 Благодарности

  • Всем участникам проекта
  • Сообществу open-source
  • Нашим спонсорам
{"ice_servers": [{"urls": "stun:stun.example.net:3478"}]}
```
I need the input content to translate. Please provide the Markdown chunk you'd like me to translate from English to Russian.```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`) и используйте приложение так, будто вы локально. Логины, куки, загрузки и стриминг — всё работает.

<!-- TODO: per-feature demos -->
<!-- Remote shell in a browser tab -->
<!-- Streaming Jellyfin through the proxy -->

### Подключение из CLI```
bitbang connect <url>                                   # interactive shell
bitbang connect <url> -- tail -f /var/log/syslog        # one-shot command
bitbang connect <url> -L 15432:db.internal:5432         # local TCP forwarding
bitbang connect <url> -L 14450:nas.local:445 -L 15900:[fd00::20]:5900
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
```
`-L` пересылает **только TCP**, как `ssh -L`. `-L` привязывается к `127.0.0.1`, если не передать
`-g`, который делает пересылаемый порт доступным из вашей локальной сети — и
любой, кто до него доберётся, получит то, до чего дотягивается туннель, без каких-либо
учётных данных BitBang перед ним.

Слушателю нужен `bitbang serve forward` или `bitbang serve`. По умолчанию
ссылка `forward` достигает **любого host:port, до которого может дотянуться слушатель**, а не только
того, который вы имели в виду, поэтому ссылка, выданная для базы данных, также достигает остальной
части этой сети. Сузьте её, указав, до чего ей разрешено дотягиваться:```
bitbang serve forward db.internal:5432        # this link reaches one service
```
Каждое успешное подключение или сопряжение сохраняется в `~/.bitbang/devices.json`, поэтому в дальнейшем достаточно короткого имени: `bitbang connect nas1`.

## Поддержка платформ

Один бинарник на платформу, без зависимостей времени выполнения. Всё работает везде, кроме двух строк, отмеченных ниже.

|                                          | Linux | macOS | Windows |
| ---------------------------------------- | :---: | :---: | :-----: |
| Shell, файлы, прокси (`bitbang serve`)     |  да  |  да  |   да   |
| Переадресация TCP (`-L`)                     |  да  |  да  |   да   |
| Ссылки доступа — выдача, срок действия, отзыв |  да  |  да  |   да   |
| Свой собственный TURN                       |  да  |  да  |   да   |
| Сопряжение по 6-значному коду               |  да  |  да  |   да   |
| Консоль слушателя (Enter)              |  да  |  да  |   да   |
| `bitbang connect`, `bitbang cp`           |  да  |  да  |   да   |
| Просмотр общей сессии                  |  да  |  да  |   да   |
| **Размещение общего доступа** (`bitbang share`)     |  да  |  да  |  нет *   |
| **Изменение размера терминала при подключении**       |  да  |  да  |  нет **  |

\* `bitbang share` публикует tmux-сессию, поэтому для её размещения нужен tmux — Linux, macOS или WSL. Нативный Windows всё ещё может открывать ссылки общего доступа с помощью `bitbang connect`.

\*\* Подключение с Windows не замечает изменения размера терминала, поэтому удалённая оболочка сохраняет размер, с которым она была запущена, пока вы не переподключитесь. Unix получает это через `SIGWINCH`, аналога которого в Windows нет.

## Безопасность

- **Самоудостоверяющаяся идентичность.** При первом запуске `bitbang` генерирует пару ключей RSA в `~/.bitbang/<program>/`; UID устройства выводится из открытого ключа, поэтому выдать себя за устройство означает найти второй прообраз его UID.
- **Секрет никогда не касается сервера.** Код доступа находится во фрагменте URL (`#…`), который браузеры никогда не отправляют — `bitba.ng` выступает посредником в соединении, не видя учётных данных, которые его авторизуют.
- **Сквозное шифрование.** Весь трафик идёт через DTLS от WebRTC. Сигнальный сервер видит только открытый ключ, производный UID и метаданные соединения — никогда ваши данные. Релейный TURN, если он нужен, видит только шифротекст.
- **Проверенное сопряжение.** Число, зачитываемое вслух при сопряжении по коду, — это короткая строка аутентификации (SAS), вычисляемая независимо на обоих концах из согласованных отпечатков DTLS и двух зафиксированных одноразовых чисел — посредник, чьи отпечатки неизбежно отличаются, не может заставить два числа совпасть.
- **URL — это учётное удостоверение-носитель.** Любой, у кого он есть, получает то, что вы решили предоставить — оболочку, если вы запустили `serve shell`. Распространяйте его соответственно.
- **Необязательный PIN-код** (`--pin`) для постоянных или безголовых установок, а также **одноразовый режим** (`-ephemeral`) для новой идентичности при каждом запуске.
- **Что сервер всё ещё видит.** Не ничего. Он выступает посредником при знакомстве, поэтому наблюдает IP-адреса обоих концов, когда они подключаются и сколько они обменивают. Сквозное шифрование не допускает его к вашим данным, но не к метаданным вокруг них — *минимальное доверие* — более точное описание, чем *бездоверие*.
- **Браузер доверяет загруженной странице.** Браузерный клиент — это JavaScript, обслуживаемый сигнальным сервером, поэтому открытие URL означает доверие этому серверу в предоставлении честного кода. У `bitbang connect` такой зависимости нет: это бинарник, который вы установили и проверили контрольной суммой. Если это различие для вас важно, подключайтесь через CLI.

Как два конца аутентифицируют друг друга, чтобы сигнальный сервер не мог встроиться в соединение, подробно описано здесь: [*Trustless Signaling: Authentication Without a Central Authority*](https://github.com/richlegrand/bitbang/blob/main/trustless-signaling.md).

## Зачем?

- **Ничего не нужно открывать или настраивать.** Работает из-за NAT, CGNAT или в закрытой сети — без изменений роутера, без VPN, без демона туннеля.
- **Ничего не нужно устанавливать на подключающейся стороне.** Достаточно браузера. CLI доступен, когда нужны скрипты, конвейеры и копирование файлов.
- **Приватность по замыслу.** Трафик — это WebRTC/DTLS, peer-to-peer. Сигнальный сервер его никогда не видит; если прямой путь невозможен, релейный TURN переносит только шифротекст.
- **Без аккаунта, без телеметрии.**


### Почему бы не использовать просто SSH? Или Tailscale?

Короткий ответ: для машины, к которой вы уже можете подключиться по SSH, или для парка собственных устройств, на которые можно установить, продолжайте использовать то, что у вас есть. `bitbang` предназначен для случаев, когда дальний конец — это человек, а не устройство, или когда вы не можете установить ничего там, где находитесь. Оба вопроса подробно рассмотрены в **[FAQ](https://github.com/richlegrand/bitbang-cli/blob/HEAD/FAQ.md)**.

## Установка```
curl -sSfL bitba.ng/install | sh
```
Linux и macOS. Определяет вашу ОС и архитектуру (`amd64`, `arm64` и `armv7` на Linux), загружает бинарный файл из последнего [релиза GitHub](https://github.com/richlegrand/bitbang-cli/releases), проверяет его SHA-256 по `checksums.txt` релиза и устанавливает в `~/.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`, поэтому загруженный им бинарный файл
работает нормально. Если вместо этого вы загрузите `bitbang-darwin-arm64` со страницы Releases
в браузере, macOS поместит его в карантин и откажется открывать, поскольку бинарные файлы релиза
не нотаризованы. Снимите карантин любой из следующих команд:```
xattr -d com.apple.quarantine ./bitbang-darwin-arm64
```
или щёлкните правой кнопкой мыши по файлу в Finder и выберите «Открыть» — это даст одноразовое
разрешение. Либо соберите из исходников — такие сборки никогда не попадают в карантин.

**Windows и SmartScreen.** То же самое происходит и в Windows, по той же
причине. Скачанный в браузере файл получает метку Mark-of-the-Web, поэтому при первом запуске
появляется сообщение *«Windows защитил ваш компьютер»* — выберите **Дополнительно**, затем **Всё равно выполнить**. 
Бинарные файлы релизов не подписаны кодом, так что это ожидаемое поведение, а не признак
какой-либо проблемы. Загрузка `.exe` через `curl` или PowerShell
`Invoke-WebRequest` не добавляет эту метку, как и сборка из исходников.

### Варианты установки

Зафиксируйте версию, измените расположение или прочитайте скрипт перед запуском:```
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`, который возвращает 302 на [`install.sh`](https://github.com/richlegrand/bitbang-cli/blob/HEAD/install.sh) в этом репозитории (в ветке `main`).
2. Скрипт запускается в вашей оболочке, определяет ОС+архитектуру и загружает бинарный артефакт с `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 shell and file sharing" width="760">
  <img src="https://assets.kitploit.com/production/public/readmes/47068/55bb6866c22504a6434e3dee8cb998e747cd73cb9d0bfa5e0bc0ede7b90ce262.png" alt="bitbang CLI proxy operation" width="720">  
</p>

## Дорожная карта

Уже доступно: **оболочка, файлы и прокси**, доступные из браузера или CLI, а также **переадресация TCP-портов**, копирование файлов в стиле scp, **парное подключение на лету** с сохранённой таблицей устройств, **совместное использование терминала** (`bitbang share`) и **ссылки доступа** (`bitbang link`), которые сужают и ограничивают по времени то, что предоставляет URL. Спроектировано и в разработке:

- **Мостик для последовательного порта** -- управление удалённым `/dev/ttyUSB0` через локальный виртуальный порт (например, запуск Arduino IDE через интернет). По этому вопросу открыт issue [здесь](https://github.com/richlegrand/bitbang-cli/issues/3).
- **Удалённый рабочий стол** -- экран через видеопоток WebRTC, клавиатура/мышь через канал данных.

## Лицензия

MIT -- см. [LICENSE](https://github.com/richlegrand/bitbang-cli/blob/HEAD/LICENSE).

## Участие в разработке

Приветствуются issues и PR.

Рецепты — это другое: они находятся в [cookbook](https://github.com/richlegrand/bitbang/blob/main/cookbook.md),
в репозитории [bitbang](https://github.com/richlegrand/bitbang), поскольку они
охватывают все проекты, а не только этот. Добавление рецепта — это PR туда.

Чтобы он был *включён в список* — это второй, небольшой PR для каждого проекта, в README которого он должен
отображаться -- список [Рецепты](#recipes) выше поддерживается здесь вручную. Это
сделано намеренно: каждый проект сам решает, какие рецепты стоит показывать своим
читателям, а не чтобы каждый README разрастался всеми рецептами.

Категории