Запись и воспроизведение терминальных сессий с помощью script

Быстрые ссылки
- Основное использование
- Добавление в существующий файл
- Сохранение временных данных
- Воспроизведение сессий
- Применение с интерактивными программами
- Другие параметры
- Когда script не подходит
- Альтернативные подходы
- Мини-методология записи сессий
- Чек-листы по ролям
- Критерии приёмки
- Шпаргалка команд
- Советы по безопасности и приватности
- Сводка
Что такое script (одно предложение)
script — утилита, которая запускает интерактивную подсессию оболочки и сохраняет всё её содержимое в текстовый файл, а при необходимости — отдельный файл с таймингами для воспроизведения.
Основное использование
Запустить script без аргументов:
scriptПо умолчанию создаётся файл ./typescript в текущем каталоге. Чтобы задать имя файла, передайте его как аргумент:
script example_sessionПосле запуска вы попадаете во внутреннюю интерактивную оболочку. Выполните команды, которые хотите записать. Чтобы завершить запись и выйти из подсессии, нажмите Ctrl+D или введите:
exitПросмотреть получившийся лог:
cat example_sessionВ файле typescript вы увидите вывод команд и встроенные аннотации в квадратных скобках — эти метки отмечают управляющие события терминала (размер окна, специальные символы и т.д.). Поскольку лог — обычный текст, вы можете редактировать его в любом редакторе, удалять строки с чувствительными данными или лишними управляющими последовательностями.
Важно: script фиксирует ВСЁ — нажатия клавиш, backspace, управляющие символы. Часто нужно отредактировать файл перед публикацией.
Примечание: script выводит имя файла в начале и в конце сессии; чтобы отключить это, используйте тихий режим -q.
SHELL-переменная среды используется для выбора оболочки; если переменная не задана, script по умолчанию использует sh.
Добавление в существующий файл
Для того чтобы дописывать новую сессию к уже существующему typescript, используйте флаг -a. Без него файл будет перезаписан:
script -a example_sessionЭто удобно, когда вы хотите «пауза/возобновление» записи — завершили подсессию, позже открыли новую и дописали шаги в тот же файл.
Сохранение временных данных
Помимо текстового лога, script умеет записывать тайминги — промежутки времени между выводами/вводом символов. Файл таймингов содержит две колонки: первая — время, прошедшее с предыдущей записи (в секундах), вторая — количество символов для вывода. Эти данные позволяют воспроизвести сессию с приблизительно тем же темпом, что и при записи.
Пример команды, создающей файл таймингов и лог одновременно (тихий режим -q подавляет информационные строки):
script -q -t example_session_timings example_sessionФормат таймингов пригоден для scriptreplay и других инструментов, которые интерпретируют два столбца: задержка и длина шага.
Воспроизведение сессий
Команда scriptreplay читает typescript и соответствующий файл таймингов и воспроизводит вывод в вашем терминале, соблюдая задержки:
scriptreplay -t example_session_timings example_sessionЕсли воспроизведение идёт слишком медленно, используйте флаг -d, чтобы делить все интервалы на заданный коэффициент:
# Запустить в 4 раза быстрее
scriptreplay -d 4 -t example_session_timings example_sessionФлаг -m позволяет задать максимальную задержку между обновлениями — если запись содержит слишком длинные паузы, их можно ограничить:
# Максимальная пауза 2 секунды
scriptreplay -m 2 -t example_session_timings example_sessionСовет: для достоверного воспроизведения запускать scriptreplay в том же типе терминала (TERM) и с теми же размерами окна, которые использовались при записи.
Применение с интерактивными программами
Не рекомендуется использовать script с сильно интерактивными приложениями — текстовыми редакторами (vim, nano), программами на curses, диалоговыми утилитами. Эти программы активно управляют курсором и экраном и генерируют управляющие последовательности, результатом чего может быть «загрязнённый» лог, трудный для чтения или воспроизведения.
Также script не предназначен для неинтерактивных сценариев: его внутренняя оболочка по дизайну интерактивна и ожидает TTY. Проброс ввода через пайпы/редиректы обычно не даёт ожидаемого результата.
Другие параметры и режимы
-c <команда>— выполнить конкретную команду и записать её вывод, вместо запуска интерактивной оболочки. Это полезно, когда нужно захватить вывод программы, которая ведёт себя по‑разному при наличии/отсутствии TTY.-f— немедленная запись: вывод сразу сбрасывается в файл после каждого события. Это повышает надёжность захвата и удобно для мониторинга в реальном времени.--force— позволяет указывать путь, который является символической ссылкой; script по умолчанию отказывает в таком случае.
Пример: выполнить команду и записать её вывод:
script -c "ls -la /some/path" /tmp/ls-outputКогда script не подходит
- При записи интерактивных пользовательских интерфейсов (ncurses, dialog) лог будет содержать много управляющих символов и беспорядок.
- Если нужно автоматически запускать команды в неинтерактивной оболочке или в контейнере CI/CD, лучше использовать логирование вывода команд через перенаправление, запуск в эмуляторе терминала типа
scriptможет не подойти. - Для двоичных или неглавным образом текстово-ориентированных приложений требуется специальный захват вывода (например, запись сетевого трафика, дампы протокола).
Альтернативные подходы
- Перенаправление вывода:
command > out.txt 2>&1— простая запись вывода и ошибок, но без интерактивных эффектов и без имитации ввода. - ttyrec / termrec — специализированные утилиты для записи терминала с акцентом на воспроизведение; иногда дают более чистое восстановление, особенно для сложных интерфейсов.
- asciinema — современный инструмент для записи терминала и публикации на веб (записывает события и воспроизводит их в браузере). Он не сохраняет всё как plain text, но генерирует удобный для просмотра веб-формат.
- Использовать контейнеризацию с записью команд в лог: для воспроизводимости запускайте контейнеры и записывайте шаги в CI-логи.
Когда выбирать альтернативу: если вам важна красивая веб-презентация — asciinema; если нужна максимально точная имитация TTY с минимальными искажениями — ttyrec; если достаточно stdout/stderr — обычное перенаправление.
Ментальные модели и эвристики
- Запись = архив + коммуникация: используйте script, когда нужно зафиксировать именно последовательность действий человека, а не только конечный вывод.
- Тайминги = динамика: если воспроизведение должно выглядеть живым (например, чтобы показать ввод по клавиатуре), сохраняйте timings (
-t). - Редактируемость: ожидайте, что записанный файл потребует ручной правки перед публичной публикацией — особенно для удаления паролей и конфиденциальных данных.
- Сопряжение терминалов: чем ближе тип и размер терминала при воспроизведении к оригиналу, тем достовернее результат.
Мини-методология записи сессий (шаги)
- Подготовка: очистите экран, закройте лишние вкладки, установите корректный размер окна и переменную TERM.
- Тестовый прого́н: быстро прогоните ключевые команды без записи, чтобы убедиться в ожидаемом выводе.
- Запись: запустите
scriptс нужными флагами (-q,-t,-aпри необходимости). - Ведение: выполняйте команды, комментируйте устно или печатайте пояснения, если планируете публиковать.
- Завершение: выйдите из подсессии (
exitили Ctrl+D). - Очистка: отредактируйте файл — удалите секреты, лишние управляющие последовательности.
- Воспроизведение/публикация: проверьте
scriptreplayи, при необходимости, конвертируйте в другой формат (asciinema, HTML).
Чек-листы по ролям
Разработчик
- Убедиться, что переменная TERM корректна
- Запустить script в каталоге проекта
- Сохранять тайминги при демонстрации взаимодействия
- Очистить лог от ключей и секретов
Учитель/ментор
- Использовать
-fдля реального времени наблюдения - Попросить ученика запускать
script -fи делиться файлами - Ограничивать максимальные паузы при воспроизведении
QA / Документация
- Записывать стабильные прогоны сценариев
- Версионировать typescript рядом с тест-кейсами
- Прописывать команду воспроизведения и параметры ускорения
Критерии приёмки
- Лог открывается как текстовый файл и содержит последовательность команд и вывод.
- При наличии файлов таймингов scriptreplay воспроизводит логи без критических искажений (в рамках тех же размеров терминала).
- В логе отсутствуют конфиденциальные данные или они помечены/удалены.
- Все ключевые шаги демонстрации читаемы и не «слипшиеся» управляющими символами.
Тестовые сценарии и примеры приёмки
- Базовая запись: запустить
script test, выполнитьecho hello, выйти и проверить, чтоhelloесть в файле. - Добавление: создать
script -a test, дописать ещё команду, проверить, что файл содержит обе сессии. - Тайминги:
script -t t.timings t.log, выполнить несколько команд с паузами,scriptreplay -t t.timings t.log— проверить, что паузы приблизительно соответствуют. - Интерактивная программа: записать запуск
nanoи проверить, что лог содержит много управляющих последовательностей (ожидаемое поведение — причина для отказа в использовании script).
Шпаргалка команд (Cheat sheet)
# Обычная запись
script mysession
# Запись с таймингами и тихим режимом
script -q -t mysession.timings mysession
# Дописать в существующий файл
script -a mysession
# Выполнить конкретную команду
script -c "tar -tf archive.tar" /tmp/tarlog
# Немедленная запись (flush)
script -f live_session
# Воспроизведение с ускорением
scriptreplay -d 4 -t mysession.timings mysession
# Воспроизведение с ограничением максимально допустимой паузы
scriptreplay -m 2 -t mysession.timings mysessionСовместимость и миграция
- script и scriptreplay входят в состав util-linux и доступны в большинстве дистрибутивов Linux. Названия и поведение в разных системах могут незначительно отличаться, особенно для старых версий.
- Для публикации логов на веб лучше конвертировать в формат, поддерживаемый asciinema, или очистить управляющие последовательности при помощи утилит вроде col или sed.
- Символические ссылки по умолчанию блокируются — используйте
--force, если требуется записать в путь, являющийся ссылкой.
Безопасность и приватность
- Никогда не записывайте сессии, содержащие пароли, ключи или другие секреты без их предварительного удаления.
- Если вы храните typescript в системе контроля версий, убедитесь, что репозиторий приватный или добавьте файл в .gitignore после публикации только очищённой версии.
- Для соответствия требованиям конфиденциальности (например, GDPR) убедитесь, что в логе нет персональных данных; при необходимости реализуйте процесс удаления и уведомления.
Important: всегда проверяйте и редактируйте лог перед распространением.
Когда использовать и когда избегать (контрпример)
Используйте script когда:
- Нужно показать пошаговую процедуру, а не только итоговый результат.
- Требуется воспроизведение с похожими интервалами ввода.
Избегайте script когда:
- Вы хотите записывать GUI-приложение или бинарный протокол.
- Вам нужно машинно-читаемое логирование stdout/stderr в pipeline без интерактивности.
Сводка
script — простой и надёжный инструмент для записи интерактивных терминальных сессий и создания текстовых typescript-файлов. Для воспроизведения используйте scriptreplay вместе с файлом таймингов. Перед публикацией обязательно очистите лог от конфиденциальных данных и учитывайте ограничения при работе с интерактивными программами.
Ключевые команды: script, script -a, script -t, scriptreplay -t, scriptreplay -d.
Если вы демонстрируете шаги другим — подготовьте мини-методологию: тестовый прогон, запись, очистка лога, проверка воспроизведения.
Сводка в одном предложении: script фиксирует интерактивную работу в терминале в виде текстового лога и опционального файла таймингов, что удобно для документации и воспроизведения шагов.
Похожие материалы
Массовое скачивание изображений из браузера
Как включить Google SGE и начать пользоваться
Как подключить контроллер Xbox к ПК
Skype не запускается в Windows 10/11 — как исправить
Обслуживание электросамоката: безопасность и советы