Я хотел бы сделать мини-игру / хранитель терминала, как cmatrix, но в оригинальной концепции он будет использовать фактическое содержимое терминала. Есть ли способ получить содержимое, отображаемое в данный момент в терминале, где запущен скрипт?
3 ответа
Существует escape-последовательность для запроса содержимого терминала (DECRQCRA). Точнее, он сообщает контрольную сумму прямоугольной области, но, выдавая ее для каждого прямоугольника 1x1, вы, вероятно, могли бы прочитать содержимое на экране. Из-за проблем безопасности большинство эмуляторов терминала не реализуют его.
Однако для достижения эффекта cmatrix с содержимым на экране вам не нужно читать ячейки. Вы даже можете использовать DECCARA для изменения атрибутов (например, невидимости, цвета, жирности) уже существующих ячеек. Это опять-таки поддерживается только несколькими терминальными эмуляторами, например, Kitty.
Определяя области прокрутки (верхний и нижний, а также левый и правый поля), я думаю, вы должны иметь возможность перемещать отдельные символы по вертикали. Я не уверен, хотя, я не пробовал. Опять же, это, вероятно, поддерживается только несколькими терминальными эмуляторами.
Не в общем, нет. Программы взаимодействуют с терминалом, отправляя ему поток команд - они не имеют прямого доступа к сетке символов.
Протокол связи имеет некоторые команды, которые возвращают определенную информацию обратно. Тем не менее, я очень уверен, что команда для возврата полноэкранного буфера не существует, и если бы она существовала, это считалось бы значительным риском для безопасности. (Например, ssh'ing для сервера позволит ему увидеть, что вы делали локально до этого.) Это уже произошло с чем-то, казалось бы, второстепенным, например, с возможностью запроса заголовка окна терминала.
(Сравните это с "консолью" Windows, которая всегда действует как буфер символов и предоставляет для этого официальные API.)
Да, есть способ сделать это ; но это требует программирования против библиотеки NCurses или чего-то подобного. NCurses - это уровень совместимости между программой пользователя и различными терминальными API.
Что касается вектора атаки сценария в удаленном сеансе, который может получить доступ к локальному терминалу, то это будет проблемой для SSH, поскольку он передает все данные между удаленной системой и локальной, включая команды терминала.