Не рекомендуется отправлять случайные данные на ваш терминал.
Случайные данные могут содержать 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 [6c, который прибыл в качестве ответа на запрос атрибутов устройства, и ESC [6c, который прибыл, потому что вы нажали клавиши Esc [ 6 c, за исключением времени.
Итак, что происходит в общем случае, если вы запускаете команду, которая не использует ввод с терминала, и набираете некоторые вещи во время работы? Введенный вами текст остается в буфере tty до тех пор, пока эта программа не будет завершена, а затем ваша оболочка прочитает его.
(Ввод команды для чтения в приглашении, которое еще не было напечатано, называется typeahead и экономит время. Вам не нужно вежливо сидеть на руках и ждать, пока компьютер завершит свою работу, если вы знаете, что хотите сделать дальше, вы можете просто начать печатать!)