Не рекомендуется отправлять случайные данные на ваш терминал.
Случайные данные могут содержать escape-последовательности, которые заставляют терминал выполнять какие-либо действия, кроме печати видимых символов.
Простые примеры из определения терминала ECMA-48 (также известного как ANSI или vt100) включают ESC [1 м для входа в полужирный режим, ESC [2 J для очистки экрана и ESC c для сброса терминала.
Некоторые escape-последовательности не просто изменяют состояние терминала - они запрашивают информацию. Они различаются для разных терминалов и эмуляторов. Примером терминала с множеством поддерживаемых escape-последовательностей и хорошей документацией на них является xterm. Его документ ctlseqs.ms
является хорошим справочным материалом, потому что многие более поздние эмуляторы терминала предназначены для совместимости с ним. Вот его веб-версия: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
Обратите ваше внимание на эту команду:
CSI Ps c Send Device Attributes (Primary DA)
Краткое руководство для понимания записи: CSI
означает либо ESC [, либо байт 0x9b
(ESC с установленным старшим битом). Ps
- это числовой параметр, который не является обязательным в этой команде (и в большинстве других). Чтобы запустить это действие путем вывода случайных байтов, вам нужно иметь только байт 0x9b
за которым следует 0x63
('c'
) где-то в потоке, что весьма вероятно в 1000 блоках по 512 байт.
Эта команда задает терминалу вопрос: «Кто ты?"и терминал отвечает, отправив escape-последовательность обратно. Есть несколько возможных ответов, которые вы можете прочитать в документе ctlseqs, но мне интересно, что в списке появляются и 6c
и 62
.
Эти escape-последовательности запроса / ответа предназначены для использования программой, которая записывает запрос и затем сразу же читает ответ. Если вместо этого запрос отправляется программой, которая просто извергала мусор и ничего не читала из терминала, ответ может остаться во входном буфере.
Помните, что терминал подключен к компьютеру с помощью последовательной линии (реальной или эмулированной). Он несет один поток байтов в каждом направлении. Там не обнаруживается разница между ESC [6 с , что прибыл в ответ на запрос атрибутов устройства и ESC [6 С, прибыли , потому что вы нажали клавиши Esc [6 с, за исключением времени.
Так что же происходит в целом, если вы запускаете команду, которая не использует ввод с терминала, и набираете что-то во время работы? Введенный вами текст остается в буфере tty до тех пор, пока эта программа не будет завершена, а затем ваша оболочка прочитает его.
(Ввод команды для чтения в приглашении, которое еще не было напечатано, называется typeahead и экономит время. Вам не нужно вежливо сидеть сложа руки и ждать, пока компьютер завершит свою работу, если вы знаете, что хотите, чтобы он делал дальше, вы можете просто начать печатать!)