Почему вывод `stty -a < /dev/pts/0 `на pts/1 отличается от вывода `stty -a `на pts/0?

Пусть это будет уроком безопасности. Ваша программа записывает входные данные, предоставленные сетью -, непосредственно в свой журнал, как -. Вы сбрасываете вывод журнала непосредственно на пользовательский терминал. Вы дали злоумышленникам в Интернете возможность контролировать вывод на вашем терминале.

Направьте ваши журналы через cyclogи multilogили аналогичные, как я объяснил в https://unix.stackexchange.com/a/505854/5132, чтобы они направлялись в набор строго ограниченных по размеру -автоматически чередующихся файлов журналов, а не в терминал.. Затем прочитайте эти файлы журналов, используя инструменты, которые очищают управляющие символы.

«Плохие символы» здесь хорошо известны и стандартизированы ECMA -35 (, также известным как ISO/IEC 2022 ), в сочетании с большим реестром наборов символов. Ваш эмулятор терминала реализует две переключаемые части 8-битного набора символов -, известные как "GL" и "GR". Различные стандартные управляющие символы и escape-последовательности переключают эти два между четырьмя назначенными наборами символов, известными как «G0», «G1», «G2» и «G3». Эти четыре, в свою очередь, сопоставляются с фактическими наборами символов с помощью дополнительных escape-последовательностей.

Набор последовательностей байтов, которые могут испортить вывод, довольно велик. Их больше, чем просто и , как можно было бы подумать из комментариев к вопросам. Возможны четыре смещения двух смещаемых областей, а также блокировка и одиночное смещение. Управляющие символы C1 для переключения имеют два представления. Тогда для каждого из четырех сдвигов имеется чуть менее двухсот возможных сопоставленных наборов символов.каждый со своей собственной escape-последовательностью.

Это довольно сложная система, и если вы в этот момент думаете: «Конечно, лучше просто использовать Unicode?» ты не будешь первым. Изобретатели moshсделали акцент на том, что их эмулятор терминала не реализует никакого переключения набора символов. Мой console-terminal-emulatorтоже. Наши эмуляторы терминала в эти трудности просто не влезут. Маркус Кун поощряет отказ от переключения набора символов ISO 2022 с 1999 года.

Дальнейшее чтение

0
17.06.2020, 01:37
1 ответ

Линейная дисциплина вашего терминального устройства не находится в каноническом режиме , когда активен линейный редактор команд оболочки -. Когда GNU Readline, ZLE, editline или другая библиотека редактирования строки команды -активно представляет свой редактор, оболочка переключает дисциплину строки терминала в неканонический -режим. Подумай об этом. Линейные редакторы, которые имеют свои собственные интерпретации управляющих символов (, включая специальные символы ), и которые немедленно реагируют на ввод каждого символа, не могут работать по-другому с терминальным вводом-выводом.

Канонический режим восстанавливается каждый раз, когда редактор строки заканчивает строку. Перейдите к первому псевдотерминалу, запустите внешнюю команду, которая выполняется в течение некоторого времени, например sleepи , затем посмотрите, что сообщает другой псевдотерминал.

3
18.03.2021, 23:26

Теги

Похожие вопросы