Назад | Перейти на главную страницу

восстановление сеанса оболочки из машинописного текста

Существует множество инструментов, таких как 'script', 'screen', 'ttyrec', которые позволяют записывать содержимое сеансов оболочки. По задумке этот инструмент записывает все, что отображается на pty, включая управляющие символы. Однако, похоже, не существует решения для удаления управляющих символов и отображения стенограммы записанного сеанса, когда он был виден пользователем. Кажется, даже программы воспроизведения некорректно работают с многострочными командами.

Я потратил некоторое время, пытаясь сделать правильный синтаксический анализатор для машинописных текстов, и пришел к выводу, что в общем случае это невозможно. Проблема в том, что современные эмуляторы терминала (terminator, xterm, rxvt) имеют автоматический перенос строк, а оболочки (bash, zsh) используют его. Для интерактивного процесса оболочки все работает хорошо, потому что он способен синхронизировать себя с шириной терминала и при необходимости корректировать положение курсора. К сожалению, «скрипт» (как и другие инструменты, насколько я могу судить) не отслеживает события изменения размера pty, и эта информация просто теряется. В результате инструмент, отображающий машинописный текст, не имеет достаточной информации и не может восстановить внешний вид многострочных команд.

Я что-то упустил? Есть решение?

Я вижу следующие возможные решения, но ни одно из них не является простым и полным:

В общем случае вам нужно переиграть в терминале того же размера.

  • Вы можете вообще игнорировать его. Как упоминалось в sendmoreinfo, вы можете объявить TERM, который не поддерживает ни одну из этих функций. Не ожидай vim или readline Но вести себя так, как ты привык.

  • Вы можете сохранить его вместе со своей расшифровкой и воссоздать правильный размер при воспроизведении (например xterm -geometry [...] -e [...]), но изменение размера все сломает.

  • Если вы очень заботитесь об этом и хотите идеальный решение, вы можете реализовать его самостоятельно!

    • Вы могли бы иметь ttyrec записывать размер терминала и его изменения, обрабатывая SIGWINCH сигнал и использование ioctl(STDIN_FILENO, TIOCGWINSZ, [...]).

    • Ваш ttyplay придется позаботиться об эмуляции самого терминала и его представлении в терминале. Это сложно, но, к счастью, есть несколько проектов, которые уже делают это, так что вы можете повторно использовать хорошо зарекомендовавшую себя кодовую базу. tmux приходит на ум, например.