
тренажёр bash CLI — 30 уровней от ls до повышения привилегий
# cmdchamp
Bash CLI-тренажёр — 30 уровней от `ls` до повышения привилегий.

Каждый вопрос просит вас ввести реальную команду — мгновенная обратная связь, двигайтесь дальше. Промахнулись — и вам не просто показывают ответ: показывают, что напечатала ВАША команда, в сравнении с ожидаемым результатом, а для конвейера — количество строк на каждом этапе, чтобы вы видели, где именно он «умер». Для вопросов с текстовым сравнением указывается, к какому принятому ответу ваш был ближе всего, и какой именно флаг вы упустили. Ответили правильно длинным путём — и вам покажут короткий: `cat f | grep -c X` заслуживает подсказку `Shorter: grep -c X f`, которая срабатывает и на меньшее число этапов конвейера, и на меньшее число символов, потому что урок — в сэкономленных процессах. Многие вопросы выполняются на реальных файлах в песочнице, и все принимают несколько корректных синтаксисов (`sort -u` или `sort | uniq`). Tab переключает man-страницу, когда нужна справка, — сокращённые страницы для каждой команды, которую выполняет ответ, плюс синтаксис shell, на который он опирается (`x=$(cmd)`, `${var:-default}`, `${path##*/}`), так что в вопросе не остаётся ничего, что нужно угадывать. Порядок рандомизируется при каждом запуске, чтобы вы не могли его заучить. Мастерство отслеживает, что вы знаете: ответьте на вопрос правильно дважды, чтобы освоить его, промахнётесь — и он понижается, чтобы вернуться раньше. Серия из 5 правильных ответов запускает fire mode — баннер, который действует, пока вы не промахнетесь.
Каждый уровень завершается босс-раундом — без man-страниц, таймер 30 секунд, 4/5 для прохода. Провалили — можно сразу повторить босса или вернуться к практике. Пройдите все 30, и откроется **challenge mode** — финальное испытание: многоступенчатые цепочки команд, которые собирают инструменты со всей игры в один конвейер. 30 секунд на каждую, одна жизнь, без man-страниц, ваш лучший результат — рекорд. Каждая цепочка оценивается по реальному выводу в песочнице, так что *любой* корректный конвейер проходит. Каждый запуск также создаёт **новую рандомизированную песочницу** — другие IP, счётчики, хосты и данные логов — и выбирает из 50+ шаблонов цепочек с меняющимися разделителями, порядком сортировки и агрегатами, так что самый загруженный IP, топовый URL, наибольший счётчик никогда не повторяются дважды. Первый запуск включает короткий обучающий курс и тест на определение уровня, который позволяет пропустить уже знакомые уровни.
С [bubblewrap](https://github.com/containers/bubblewrap) команды выполняются в реальной изолированной файловой системе и оцениваются по фактическому выводу. Внутренняя «коробка» синтетическая — пользователь `sandbox`, хост `sandbox`, собственные `/etc/passwd` и командная строка ядра — так что ничто из введённого вами не выведет на экран ваше реальное имя пользователя, имя машины или структуру диска, а `id`, `whoami` и `hostname` отвечают одинаково везде. Это распространяется и на уровень криминалистики: уровень 28 выдаёт вам реальный образец бинарника (`samples/target.bin`) и оценивает, действительно ли вы извлекли из него флаг, домен эксфильтрации и утёкший API-ключ — то же самое для вопросов `jq` на реальном JSON. Финальное испытание собирает эти извлечения в цепочки с таймером. Уровни 24–25 теперь тоже выполняются по-настоящему: внутри собственного сетевого пространства имён песочницы запускается небольшой HTTP-сервис на `localhost:8080`, пока выполняется ваш ответ, с тремя слушающими портами, так что `curl`, `jq` по HTTP, `ss` и `nmap` оцениваются по тому, что они реально вернули. Ничего не открывается вашей машине — пространство имён по-прежнему блокирует все исходящие соединения, а порт невидим снаружи. Только инструменты, которые физически не могут работать в песочнице — wifi/RF, захват трафика в реальном времени и крупномасштабная криминалистика памяти/диска — остаются с текстовым сравнением. Уровни поиска (16–17) принимают и синтаксис `rg`/`fd`, и `grep`/`find`. Встроено редактирование строк в стиле Vi — движения, операторы, счётчики, регистры, отмена и визуальный режим (`v`/`V`, `o` для смены конца), с `?` для полной карты клавиш.
## Установка
**Arch (AUR):**
```bash
paru -S cmdchamp # or: yay -S cmdchamp
```
**Где угодно (один файл):**
```bash
mkdir -p ~/.local/bin && curl -sL https://raw.githubusercontent.com/mellen9999/cmdchamp/main/cmdchamp -o ~/.local/bin/cmdchamp && chmod +x ~/.local/bin/cmdchamp
```
Добавьте `~/.local/bin` в PATH при необходимости: `echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc`
**Или клонируйте:**
```bash
git clone https://github.com/mellen9999/cmdchamp.git
cd cmdchamp && make install
```
**Требуется:** bash 4.4+, coreutils, awk
**macOS:** Поставляется с bash 3.2 — сначала установите bash 4.4+: `brew install bash`
**Опционально:** [bubblewrap](https://github.com/containers/bubblewrap) (`bwrap`) для режима песочницы (только Linux) — большинство дистрибутивов для десктопа включают его. Без него ответы сравниваются только по тексту
**Опционально:** `python3` — обслуживает HTTP-сервис localhost песочницы, поэтому вопросы `live api` / `live box` на уровнях 24–25 оцениваются по реальному выводу. Без него эти вопросы возвращаются к текстовому сравнению; больше ничего не меняется
**Доступность:** Учитывает `NO_COLOR` и `TERM=dumb`. Раскладка адаптируется к `COLUMNS` / `tput cols`. Полосы мастерства несут и цвет, и символ `✓` / `~` / `x` — читаемы и без цвета.
**Терминалы:** Работает на настоящих последовательных терминалах, а не только эмуляторах. cmdchamp проверяет, что терминал реально может отобразить, и выбирает один из трёх уровней отрисовки — Unicode, DEC ACS псевдографика или чистый ASCII, — так что рамки остаются целыми на VT100/VT220/VT320/VT420 или Wyse. На монохромном экране цветовые различия перекодируются в жирный/инверсный. Принудительно задайте уровень через `CMDCHAMP_ASCII=1` или `CMDCHAMP_UNICODE=1`. `./test_terminals.sh` проверяет это.
## Использование
```bash
cmdchamp # Запустить игровое меню
cmdchamp explain 'CMD' # Объяснить любую команду — каждый флаг, плюс окружающий синтаксис shell
cmdchamp autopsy # Прочитать собственную историю shell и сопоставить её с учебной программой
cmdchamp daily # Сыграть сегодняшний ежедневный забег (одинаковый для всех)
cmdchamp daily 2026-02-16 # Переиграть забег конкретного дня (посоревнуйтесь с другом)
cmdchamp play # Песочница свободной игры: введите любую команду, посмотрите, как она выполняется
cmdchamp --no-sandbox # Отключить песочницу (только текстовое сравнение)
cmdchamp reset # Сбросить весь прогресс
cmdchamp test # Запустить самотесты
cmdchamp version # Показать версию
cmdchamp help # Показать справку
```
`cmdchamp explain` (или `cmdchamp x`) — это панель Tab как отдельный инструмент: вручную написанные страницы для ~300 команд плюс окружающий синтаксис shell, офлайн, без сети, без зависимостей. Принимает команду в кавычках или отдельные слова, а при отсутствии того и другого читает stdin — так что `history | tail -1 | cmdchamp x` объясняет, что вы только что выполнили. Выход 0, когда команда известна, 1 — когда нет.
`cmdchamp autopsy` читает историю вашего shell — `$HISTFILE`, затем `~/.bash_history`, затем `~/.zsh_history`, или файл, который вы укажете, или `-` для stdin — и сопоставляет её с 30 уровнями: к чему вы реально тянетесь, привычки, от которых стоит отказаться, с вашим собственным счётчиком рядом с каждой (`cat` в `grep`, `find` в `xargs` без `-print0`, `chmod 777`, `curl | sh`), сколько команд, которым учит игра, вы когда-либо запускали, и самый ранний уровень с пробелом. Он выводит **только паттерны и счётчики** — никогда строку, фрагмент или «пример» из вашей истории, потому что в истории хранятся токены и пароли, введённые как аргументы. Ничего не покидает машину, и нет флага, чтобы заставить его выводить вашу историю.
Меню содержит продолжение, новую игру, сценарии, испытание, ежедневный забег, практику, статистику, настройки, справку и выход на фиксированных горячих клавишах `1`–`9` и `0`. Строка, которую вы ещё не разблокировали, затемняется, а не скрывается, поэтому цифра рядом с меткой никогда не сдвигается по мере прогресса. `j`/`k` или стрелки перемещают курсор, Enter выбирает, а `q` (или Esc) выходит. Площадка находится вверху списка **Сценариев** — это единственная запись, которая никогда не блокируется. **Справка** — это справочник на трёх страницах: все клавиши, что стоит и открывается на каждом режиме, как работают подсчёт очков и затухание, что означают отметки в статистике, как оценивается ответ и каждая переменная окружения. Обучающий курс первого запуска по-прежнему в одном нажатии клавиши на последней странице.
**Ежедневный забег** (после ROOT) — это забег с посевом по дате: посев управляет и цепочками, и рандомизированной песочницей, так что все и везде получают байт-идентичные вопросы *и* данные в этот день, одна засчитанная попытка, серия подряд идущих дней и копируемый счёт, которым можно поделиться. **Практика** отрабатывает любой достигнутый уровень (показан с его % мастерства) с подсказками и без таймера, не затрагивая основной прогресс. **Площадка** — это скомпрометированная машина, которую вы разбираете настоящим shell: кто-то проник, использовал её, затем попытался прибраться, и каждое действие оставило след на диске. Команды выполняются по-настоящему в песочнице, и ничего не оценивается. До 8 токенов `flag{...}` спрятаны по дереву (больше открывается по мере прохождения уровней), `map` раскладывает взлом по фазам и отмечает, где вы находитесь, `learn` — это учебная программа по безопасности из 8 модулей за этим, `hint` углубляется на уровень с каждым запросом, а Tab объясняет, что вы ввели. Заголовок всегда называет фазу, которую вы ищете, и файлы, которые она оставила, так что вы никогда не смотрите на приглашение, не зная, куда направить команду, — а если шесть команд прошли без находки, первая подсказка приходит сама.
## Статистика
Две страницы. Первая — тридцать полос уровней: как далеко вы продвинулись. Вторая — то же мастерство, спроецированное на **команды**, от самых слабых, потому что уровень — слишком крупная единица для отработки: один уровень 13 обучает `cp`, `mv`, `ln`, `chmod`, ACL, `du`, `tar` и `diff`, и одна красная полоса не скажет, какие из них вы продолжаете упускать. Учитываются только достигнутые уровни, а сетка ограничена одним экраном — список задач, который нужно прокручивать, не список задач. Под ней названы три самые слабые команды с уровнем, который обучает каждой, так что страница заканчивается там, где начинается Практика, — названия уровней тематические, и `xargs 0/4` — тупик, если приходится угадывать, что он живёт в Batch Ops.
## Уровни
| # | Название | Фокус |
|---|------|-------|
| | **Основы** | |
| 1 | Первые шаги | pwd, ls, echo, cd, mkdir |
| 2 | Основы файлов | cp, mv |
| 3 | Сохраните работу | >, >>, tee |
| 4 | Чтение файлов | cat, head, tail, less |
| 5 | Базовые конвейеры | pipes, grep, wc, sort, uniq |
| 6 | Ввод и here-строки | <, <<<, tr, cut, rev, bc |
| 7 | Обработка ошибок | 2>, 2>&1, &>, /dev/null |
| 8 | Логические операторы | &&, \|\| |
| 9 | Переменные | `$VAR`, присваивание, раскрытие |
| 10 | Специальные переменные | `$$`, `$?`, `$!`, `$#`, `$@`, `$0` |
| 11 | Управление заданиями | bg, fg, jobs, &, Ctrl+Z, nice, ulimit |
| 12 | Условия проверки | -f, -d, -z, -n, -eq, -lt |
| 13 | Основные файловые инструменты | cp, mv, ln, chmod, ACL, du, tar, diff |
| 14 | Системное администрирование | ping, df, free, ss, systemctl, ip, sysctl, lsblk, getent |
| 15 | Мультиплексоры | tmux: сессии, окна, панели |
| 16 | Поиск текста | grep, ripgrep, regex |
| 17 | Поиск файлов | find, fd, по имени/размеру/времени/типу |
| 18 | Обработка данных | sort, uniq, cut, awk, tr, comm, join, numfmt |
| 19 | Строки и массивы | раскрытие параметров, массивы |
| 20 | Управление потоком | if/else, циклы, case, функции |
| 21 | Пакетные операции | find -exec, xargs, sed -i, crontab |
| 22 | Продвинутые regex | lookahead, sed, awk |
| | **DevOps и безопасность** | |
| 23 | Git | ветки, удалённые репозитории, rebase, stash, bisect |
| 24 | Сетевые инструменты | tshark, curl, jq, ssh-туннели, openssl, SMB, живая HTTP-конечная точка |
| 25 | Сканирование сети | nmap, определение сервисов, скрипты, живая цель |
| 26 | WiFi и RF | aircrack-ng, netcat, tcpdump, беспроводная разведка |
| 27 | Взлом хешей | hashcat, john, hydra, кодирование |
| 28 | Криминалистика | strings, readelf, binwalk, volatility, exiftool |
| 29 | Повышение привилегий | SUID, capabilities, GTFOBins, перечисление |
| 30 | ROOT | аварийное восстановление, chroot, выживание офлайн |
## Сценарии
Многошаговые задания в песочнице — состояние сохраняется между шагами. Доступны из меню **Сценарии** после прохождения босса-разблокировки, который перечисляет их в порядке открытия под площадкой. Числа ниже — это id сценариев, которые никогда не меняются.
| # | Название | Открывается после | Шагов |
|---|------|-----------|-------|
| 1 | Блокировка прав | босс L13 | 6 |
| 2 | Архив и извлечение | босс L13 | 6 |
| 3 | Найди иголку | босс L16 | 7 |
| 4 | Грязный CSV | босс L18 | 4 |
| 5 | Инцидент | босс L18 | 5 |
| 6 | Сломанный деплой | босс L21 | 7 |
| 7 | Авария в логах | босс L21 | 5 |
| 8 | Хирургия конфигов | босс L21 | 5 |
| 9 | Спасение Git | босс L23 | 6 |
| 10 | Пакетный рефакторинг | босс L21 | 6 |
| 11 | Криминалистическая зачистка | босс L22 | 6 |
| 12 | Резервное копирование с wildcard | босс L29 | 4 |
| 13 | Перехват PATH | босс L29 | 4 |
Сценарии 12–13 — это эксплойт-боксы: вы внедряете реальную tar-checkpoint инъекцию / перехват PATH и оцениваетесь по артефакту, который она создаёт (появляется файл, эксфильтрируется секрет). *Эффект* эксплойта выполняется по-настоящему в песочнице; граница привилегий симулируется — ничего не выполняется как настоящий root.
## Тест на определение уровня
После обучающего курса первого запуска вас спрашивают, хотите ли вы пройти тест на определение уровня, чтобы перепрыгнуть вперёд. Согласитесь — и он задаёт 2 вопроса на уровень, по 30 секунд на каждый, без man-страниц. Один промах — и это ваш стартовый уровень.
## Пасхальные яйца
8 скрытых достижений. Экран статистики показывает, сколько вы нашли.
## Управление
| Клавиша | Действие |
|-----|--------|
| Enter | Отправить ответ |
| Tab | Переключить man-страницу |
| Ctrl+d | Выход (сводка сессии) |
| Esc | Vi обычный режим |
| ? | Все привязки клавиш (обычный режим) |
## Данные
Прогресс сохраняется в `${XDG_DATA_HOME:-~/.local/share}/cmdchamp/`.
## Лицензия
MIT