asciinema - Запись и воспроизведение терминальных сессий в Linux
Приветствую!

Asciinema - инструмент для записи терминальных сессий и их воспроизведения с максимальной точностью. Он идеален для документирования процессов, создания обучающих материалов, сохранения истории или отладки.

Немного про Asciinema

Asciinema - это ПО с открытым исходным кодом для записи и воспроизведения терминальных сессий: в отличие от видео, она сохраняет ввод/вывод терминала как текстовые данные (JSON-формат), благодаря чему запись занимает мало места, остаётся чёткой при любом масштабе, а записанный текст можно копировать; готовые записи можно воспроизводить локально в терминале или встраивать/делиться через веб (asciinema.org или свой сервер).

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

Вводные данные

В статье использовались следующие версии ПО:

ПОВерсия
Linux Mint/Ubuntu22.3/24.04
asciinema3.2.1
agg1.9.0

Демо

Чтобы вы сразу поняли, о чём речь - ниже пара демонстрационных записей терминала, выполненных с помощью Asciinema.

Демо номер 1: нажмите плей для запуска

Демо номер 2: автоплей и повтор

Установка Asciinema

Самый быстрый способ - скачать готовый бинарник последней версии:

BASH
mkdir -vp ~/.local/bin

curl -Lo ~/.local/bin/asciinema \
  https://github.com/asciinema/asciinema/releases/latest/download/asciinema-x86_64-unknown-linux-gnu

chmod +x ~/.local/bin/asciinema
Нажмите, чтобы развернуть и увидеть больше

Проверяем версию:

BASH
asciinema --version
Нажмите, чтобы развернуть и увидеть больше

Запись сессии

Базовая запись сессии выглядит так:

BASH
asciinema rec ./demo.cast
Нажмите, чтобы развернуть и увидеть больше

После выполнения команды терминал переходит в режим записи. Вы видите приглашение системы, печатаете команды, смотрите результаты - всё это записывается. Когда вы закончили, нажимаете Ctrl+D или вводите exit, и запись сохраняется в файл demo.cast.

Если вы хотите дополнить запись или начать её заново - используйте параметры --append и --overwrite (или просто удалите файл).

BASH
asciinema rec ./demo.cast --overwrite
Нажмите, чтобы развернуть и увидеть больше

Воспроизведение

Для просмотра записи прямо в терминале используйте команду:

BASH
asciinema play ./demo.cast
Нажмите, чтобы развернуть и увидеть больше

Запись будет воспроизведена с теми же временными интервалами, что и при записи. Это удобно для проверки, что всё записалось корректно, или для просмотра на машине без браузера.

Если вам нужно ускорить воспроизведение (например, если запись заняла 10 минут, но вы хотите посмотреть за минуту), используйте флаг --speed:

BASH
asciinema play --speed 2 ./demo.cast
Нажмите, чтобы развернуть и увидеть больше

Здесь 2 означает двойную скорость. Можно использовать значения вроде 0.5, 1.5, 3.

Полезные опции

Когда вы записываете сессию, доступны флаги, которые могут быть полезны:

Пример полноценной записи с параметрами:

BASH
asciinema rec --title "Nginx setup" --cols 120 --rows 30 ./nginx.cast
Нажмите, чтобы развернуть и увидеть больше

Работа с временем

Иногда в записи есть моменты, где вы долго печатали или ждали ответа сервера, и это удлиняет демонстрацию для зрителя. Asciinema позволяет редактировать эти задержки.

Файл .cast - это простой текстовый JSON-подобный формат. Каждая строка содержит информацию о временной метке, типе события и данных. Если вы откроете файл в редакторе, вы увидите что-то вроде:

JSON
[0.0, "o", "$ "]
[0.5, "o", "echo hello"]
[0.1, "o", "\r\n"]
[1.2, "o", "hello\r\n"]
Нажмите, чтобы развернуть и увидеть больше

Первое число - это временной интервал в секундах от предыдущего события. Если вы видите [5.0, ...] и знаете, что это задержка, которую можно сократить, вы можете отредактировать это число вручную.

Но правильнее всего использовать параметр --idle-time-limit. Его можно использовать как при проигрывании (play), так и при записи (rec). Смысл его в том, чтобы длительные “паузы” во время сессии - длительные простои терминала - не записывать и не воспроизводить. Например, если в записанной сессии есть момент ожидания завершения длительного процесса без вывода в терминал, допустим, в течение 2 минут, то при указании --idle-time-limit 2 этот момент сократится до 2 секунд. Очень удобно на мой взгляд.

Конвертирование cast-файлов в GIF и MP4

Asciinema хороша для встраивания в веб-сайты, но иногда может потребоваться более универсальный формат - например, GIF или MP4. Тут ребята из Asciinema уже позаботились об этом, написав консольную утилиту agg (asciinema gif/mp4 generator).

Установка agg

agg написана на Rust, и самый простой способ установки - аналогично Asciinema:

BASH
curl -Lo ~/.local/bin/agg \
  https://github.com/asciinema/agg/releases/latest/download/agg-x86_64-unknown-linux-gnu

chmod +x ~/.local/bin/agg
Нажмите, чтобы развернуть и увидеть больше

После установки agg проверяем:

BASH
agg --version
Нажмите, чтобы развернуть и увидеть больше

Создание GIF

Самое частое применение agg - конвертирование .cast-файла в анимированный GIF:

BASH
agg ./demo.cast ./demo.gif
Нажмите, чтобы развернуть и увидеть больше

Готово. Размер GIF обычно больше, чем .cast-файл, но намного меньше видео того же качества.

Если запись слишком долгая и GIF получился громоздким, можно ускорить воспроизведение:

BASH
agg --speed 2 ./demo.cast ./demo.gif
Нажмите, чтобы развернуть и увидеть больше

Флаг --speed 2 означает двойную скорость, как мы видели в Asciinema.

Создание MP4

Если вам нужно видео в формате MP4, agg тоже справляется:

BASH
agg ./demo.cast ./demo.mp4
Нажмите, чтобы развернуть и увидеть больше

Полезные опции agg

agg поддерживает множество параметров для управления выводом:

Пример с несколькими параметрами:

BASH
agg --speed 1.5 --theme dracula --font-size 16 --idle-time-limit 2 ./demo.cast ./demo.gif
Нажмите, чтобы развернуть и увидеть больше

Эта команда создаст GIF с полуторной скоростью, тёмной темой Dracula, с крупным шрифтом, и максимальная пауза между действиями будет 2 секунды (если пауза была дольше, она сократится).

Встраивание в веб-страницу

Если вы хотите показать запись на веб-сайте, как в начале этой статьи, Asciinema предоставляет простой способ встраивания - скрипт на JavaScript. Браузер автоматически подгружает интерактивный плеер, и читатель может нажать Play, посмотреть запись, перемотать её манипулятором типа мышь. Ну а файлы записей сессий обычно занимают пару килобайт.

Подробности установки, в т.ч. для разных CMS, смотрите в оф. документации: https://docs.asciinema.org/manual/asciicast/v3/ или в репозитории на GitHub: https://github.com/asciinema/asciinema-player.

Если вы встраиваете в статическую HTML-страницу, загрузите файл .cast на ваш хостинг (или используйте URL), и вставьте код:

HTML
<asciinema-player src="path/to/demo.cast"></asciinema-player>
<script src="https://js.asciinema.org/v3/bundle.js"></script>
Нажмите, чтобы развернуть и увидеть больше

В этом случае даже скрипт возьмётся из удалённого источника. Но для меня такой способ менее приемлем.

Параметры плеера, которыми можно управлять:

Пример такого встраивания вы и видите на этой странице в разделе “Демо”. Работает со всеми браузерами.

Облачное хранилище и обмен

Если вы хотите поделиться записью с коллегой или загрузить её на публичный сервер, Asciinema предоставляет интеграцию со своим облачным хранилищем на asciinema.org.

Загрузить запись туда просто:

BASH
asciinema upload ./demo.cast
Нажмите, чтобы развернуть и увидеть больше

Вы получите URL вида https://asciinema.org/a/ABC123, который можно дать кому угодно. Зритель сможет посмотреть запись прямо на сайте разработчика, без необходимости скачивания.

Однако если вы работаете в приватной сети или как я, предпочитаете не доверять третьим сторонам, просто держите файл .cast на вашем собственном сервере и встраивайте его через HTML-код, о котором мы говорили выше.

Автоматизация записей

Если нужно запустить несколько команд без интерактивного ввода и сразу записать результат:

BASH
asciinema rec -c "bash -c 'ls -la; df -h; docker ps'" ./demo.cast
Нажмите, чтобы развернуть и увидеть больше

Флаг -c говорит asciinema сразу выполнить эту команду как записываемый процесс.

Послесловие

Asciinema - инструмент с очень узкой специализацией, но в этой специализации он почти идеален! Если вы пишете техническую документацию, создаёте обучающие материалы или просто фиксируете свой терминальный вывод, то это лучший способ для этого.

В следующей статье я расскажу как удобно и просто записывать все свои сессии терминала. При этом не занимая много места, с удобной индексацией сессий и шифрованием файлов. Подписывайтесь на телегу, чтобы не пропустить.

Спасибо, что читаете. Успехов! 🐧

Используемые материалы

Авторские права

Автор: Иван Чёрный

Ссылка: https://r4ven.me/software/asciinema-zapis-i-vosproizvedenie-terminalnyh-sessiy-v-linux/

Лицензия: CC BY-NC-SA 4.0

Использование материалов блога разрешается при условии: указания авторства/источника, некоммерческого использования и сохранения лицензии.

Начать поиск

Введите ключевые слова для поиска статей

↑↓
ESC
⌘K Горячая клавиша