что такое терминальная escape-последовательность для ctrl + arrow (left, right,...) в TERM=linux

Я создаю окно терминала в браузере (sth. как ajaxterm) и не знаю, какую escape-последовательность отправить в SSH-туннель (открыт через paramiko.SSHClient().invoke_shell(term='linux')).

Я нашел кейлоггер и попробовал его в терминале с $TERM = = 'linux', но он возвращает ту же последовательность для ctrl+left и left (27,91,68).

Если я попробую кейлоггер в другом терминале (с $TERM == 'xterm'), я получаю коды (27,91,49,59,53,68). Но эти коды не перемещаются ожидаемый вывод из SSH-канала (который переместит курсор на одно слово, оставшееся на обычной оболочке linux). Это верно, даже если я начну paramiko с term= 'xterm'.

есть идеи, какую последовательность я должен использовать? Или почему вышеприведенная последовательность не работает?

обновление: я был бы рад использовать другой тип терминала (не "linux"), но, к сожалению pyte работает только с терминалами VTxxx (я считаю, что "linux" - это vt220-подобный терминал-во всяком случае, он работает), поэтому в xterm не работает должным образом.

3 ответов


терминалы были аппаратными устройствами, которые состояли из клавиатуры и устройства вывода (первоначально печатный принтер, позже ЭЛТ-монитор). Большой компьютер может иметь несколько удаленных терминалов, подключенных к нему. Каждый терминал будет иметь протокол для эффективной связи с компьютером, для терминалов на основе ЭЛТ это включает в себя наличие специальных "управляющих последовательностей" для изменения положения курсора, стирания частей текущей строки/экрана, переключения в альтернативный полноэкранный режим, ...

эмулятор терминала-это приложение, эмулирующее один из этих старых терминалов. Он позволяет выполнять такие функции, как позиционирование курсора, настройка цветов переднего плана и фона ... Эмуляторы терминалов пытаются эмулировать какой-то конкретный протокол терминала, но каждый имеет свой собственный набор причуд и отклонений.

системы Unix имеют базы данных, описывающие терминалы и эмуляторы терминалов, поэтому приложения абстрагируются от конкретного терминала (или эмулятора терминала) в использовать. Старая база данных termcap(5), а terminfo(5) новая база данных. Эти базы данных позволяют приложениям запрашивать возможности используемого терминала. Возможности могут быть логическими, числовыми или даже строковыми, например: если определенный тип терминала имеет / поддерживает ключ F12, он будет иметь возможность "key_f12" (длинное имя terminfo), "kf12" (короткое имя terminfo), "F2" (имя termcap), описывающее строку, которую создает ключ. Попробуйте с:tput kf12 | od -tx1.

С Программирование непосредственно с возможностями может быть громоздким, приложения, как правило, использовать более высокоуровневые библиотеки, такие как проклятия/с ncurses, сленг и т. д...

существует специальная переменная среды под названием TERM это говорит приложениям, с каким типом терминала они разговаривают. Эта переменная должна быть настроена на конкретный тип терминала, если он существует в базе данных, для достижения наилучших результатов. Это просто говорит приложению, какие точные отклонения протокола и протокола понимает терминал. Изменение TERM переменная не изменить тип терминала, он просто изменяет тип терминала приложение думает, что он разговаривает.

все, что сказал, Ctrl+arrow - это поведение xterm (зависит от параметра конфигурации), которое вообще не отражается в базах данных terminfo/termcap, поэтому большинство приложений не будут знать об этом. В любом случае, либо ваш эмулятор терминала (в вашем случае pyte) поддерживает его или нет.

предполагая ваше основное приложение bash или какое-то другое приложение, которое использует readline библиотека, вы можете уйти с помощью readline в backward-word (Meta-b/Alt-b / ESC b по умолчанию, настраивается в inputrc вместо).


быстрая проверка с od -c показывает, что gnome-termainal генерирует следующие значения:

стрелка влево генерирует ESC -[ -D.

управление-левый массив geneates ESC -[ -1-;-5-D


коды клавиш Ctrl+arrow были введены xterm, и подобные gnome Terminal и KDE Konsole пытаются быть совместимыми с xterm. Фактические терминалы VT100 и VT220 не имели отдельных кодов ключей для таких комбинаций. Насколько я знаю, консоль Linux стремится быть совместимой с VT100 с некоторыми дополнениями, в то время как xterm эмулирует VT220 с большим количеством дополнений.