Как записывать команды терминала Linux с помощью «сценария»
Команда script
позволяет записывать и воспроизводить действия в вашем терминале. Это полезно, когда вы хотите создать ссылку на шаги, которые вы предприняли, или вы создаете учебник для других.
script
выводит машинописный текст всех запущенных вами команд. Он работает, помещая вас во вспомогательную оболочку, которая регистрирует все, что вы выполняете. Ваш сеанс будет сохранен как обычный текст, когда вы покинете оболочку. Это делает script
более надежным, чем перенаправленные входные потоки.
Основное использование
Команду script
можно запустить без аргументов:
script
Начнется новый сеанс захвата. Ваш терминальный сеанс будет сохранен в ./typescript
в вашем рабочем каталоге. Вы можете указать другой файл, указав аргумент script
:
script example_session
Используйте вашу оболочку для выполнения последовательности команд, которую вы хотите записать. Когда вы закончите, нажмите Ctrl+D
или введите exit
, чтобы выйти из подоболочки. Вы вернетесь к своему основному сеансу оболочки.
Теперь вы можете проверить журнал сеанса, который был создан:
cat example_session
Вы увидите вывод сеанса script
с вкраплениями аннотаций в квадратных скобках. Эти аннотации используются script
для записи сведений о самом терминале и происходящих в нем событиях.
Поскольку файлы журналов представляют собой обычный текст, вы можете свободно манипулировать ими в своем любимом редакторе. Просто вырежьте все строки, которые вы не хотите сохранять или которые другие не должны видеть.
Это полезно, если ваш сеанс непреднамеренно выводит потенциально конфиденциальную информацию или вы хотите удалить посторонние символы из журнала. script
записывает все, что происходит в вашем терминале, включая нажатия на клавишу Backspace, новые строки и управляющие символы, некоторые из которых могут не понадобиться в окончательном машинописном тексте.
script
выдает имя файла, в который он записывает, в начале и в конце вашего сеанса. Вы можете отключить этот вывод, добавив флаг -q
, чтобы включить тихий режим.
Переменная среды SHELL
считывается при определении оболочки для разветвления внутреннего процесса. Если переменная не установлена, script
по умолчанию будет sh
.
Добавление к существующему файлу
Можно добавлять новые команды к существующему машинописному тексту. Это позволяет вам «приостанавливать» и «возобновлять» запись, выходя из вашей подоболочки и начиная новый сеанс.
Добавьте флаг -a
, чтобы добавить свои команды в указанный файл. script
перезапишет содержимое файла, если флаг не указан.
script -a example_session
Добавление данных синхронизации
Базовый машинописный текст идеально подходит, если вы просто хотите записать свои шаги для последующего чтения или обмена. script
также может сохранять временные данные вместе со своим текстовым журналом. Эту информацию можно использовать для воспроизведения всего сеанса терминала с соответствующими задержками между командами.
Запустите script
с флагом -t
, чтобы указать путь для записи таймингов. Файлы синхронизации имеют двухколоночный формат. Каждая запись содержит время, прошедшее с момента последней записи в первом столбце. Во втором столбце записывается количество введенных символов, что позволяет точно воспроизвести скорость набора текста.
script -q -t example_session_timings example_session
Воспроизведение сеансов
Команда scriptreplay
считывает машинописные тексты и файлы синхронизации, созданные с помощью script
. Он воспроизводит их вывод в ваш терминал. Данные синхронизации будут использоваться для сопоставления продолжительности каждого введенного символа с его длиной в исходной последовательности команд.
scriptreplay -t example_session_timings example_session
Некоторые машинописные тексты могут содержать нежелательные задержки или выполняться с неудобно низкой скоростью. Используйте флаг -d
для ускорения вывода. Все записанные тайминги будут разделены на число, которое вы пройдете.
# Run 4 times faster scriptreplay -d 4 -t timings typescript
Вы также можете использовать флаг -m
, чтобы ограничить максимальную задержку между отдельными обновлениями. Это позволяет указать максимально допустимую паузу в секундах, прежде чем scriptreplay
перейдет к следующей команде, даже если в машинописном тексте указана более длительная задержка.
# Maximum delay of 2 seconds scriptreplay -m 2 -t timings typescript
Использование с интерактивными командами
Не рекомендуется использовать script
с сильно интерактивными командами. Текстовые редакторы терминала, приложения на основе curses и диалоговые подсказки могут вставлять в машинописный текст загрязняющие символы. script
фокусируется на захвате типичного текстового вывода, а не на командах, которые манипулируют вашим терминалом для создания графического интерфейса.
script
не подходит для использования с неинтерактивными оболочками, поскольку его внутренняя оболочка всегда интерактивна по своей природе. Также не следует ожидать, что команда будет работать с конвейерным вводом.
Другие варианты
Флаг -c
для script
позволяет указать команду. Когда используется этот режим, script
запускает команду и фиксирует ее вывод вместо создания новой интерактивной оболочки. Это может быть более эффективным при захвате выходных данных некоторых процессов, которые ведут себя по-разному, если не подключены напрямую к TTY.
Флаг -f
указывает script
писать сразу в журнал сеанса после каждого события. Это повышает безопасность, обеспечивая немедленный захват выходных данных.
Страница руководства script
предполагает, что этот флаг также можно использовать для мониторинга пользовательского терминала в режиме реального времени, например, в сценарии учителя и ученика. Учащийся запускал script -f
, затем учитель использовал SSH для подключения и потоковой передачи машинописного файла в реальном времени.
script
обычно не принимает символическую ссылку в качестве пути машинописного текста. Флаг --force
включает это поведение, предписывая script
разрешать жесткие и программные ссылки на их место назначения.
Краткое содержание
script
позволяет записывать сеансы терминала в текстовые файлы с точными временными данными. Вы можете проверять, публиковать и распечатывать машинописные тексты вручную или воспроизводить их в своем терминале с помощью scriptreplay
.
Команды включены в большинство популярных дистрибутивов Linux. Они работают со всеми типами терминалов, но отдельные машинописные тексты могут неправильно воспроизводиться на терминале, отличном от того, который используется для записи. Для достижения наилучших результатов запустите scriptreplay
в том же типе терминала, который вы использовали с script
.