У меня есть несколько устройств, подключенных к серверу последовательных терминалов Cisco; многие работают нормально, когда я telnet
напрямую в порт на Cisco. Тем не менее, у меня есть несколько упрямых устройств, которые не будут использоваться, так Backspaceкак они отображаются в telnet по умолчанию.
В случае, если это имеет значение, я делаю телнет из- rxvt
под Debian squeeze (в окне X Window). TERM
установлен на rxvt
, но это не имеет значения , использую ли я vt100
, vt101
или xterm
... изменение TERM
не имеет никакого эффекта. Я начал свой путь перемен, TERM
основываясь на том, что видел в старом FAQ по Kermit . FWIW, stty erase ^h
и stty erase ^?
тоже не работают.
Я заметил , что Backspaceкорректно работает на этих устройствах , если я использую необработанный TCP сокет из netcat
... то есть nc 192.168.12.117 2006
; однако затем я сталкиваюсь с другими проблемами с паролями, которые не скрыты, или с терминалом.
Как я могу выборочно заставить telnet и ssh подключаться Backspaceк CtrlHэтим устройствам? Кроме того, какие критерии я должен использовать, чтобы оценить, является ли это ошибкой в устройстве?
РЕДАКТИРОВАТЬ
В случае, если это имеет значение, это вывод showkey -a
для соответствующих ключей ... ^?
соответствует Backspaceи ^H
есть CtrlH. Кажется, что я должен быть ближе, когда смотрю на Linux Keyboard and Console Howto , но я не могу понять , что я могу сделать, чтобы изменить это. Я пробовал разные заклинания безрезультатно loadkeys
.
[mpenning@hotcoffee docs]$ sudo showkey -a
Press any keys - Ctrl-D will terminate this program
^? 127 0177 0x7f
^H 8 0010 0x08
Я также включаю соответствующие выходные данные dumpkeys
... это текущее отображение в моей системе (которое не работает на некоторых устройствах). Если бы я мог понять, как добиться Backspaceтого же, что CtrlHи я, у меня было бы решение.
[mpenning@hotcoffee docs]$ sudo dumpkeys | grep -Ei "backspace|127"
keycode 8 = BackSpace ampersand braceleft
keycode 14 = BackSpace Delete
control keycode 14 = BackSpace
keycode 127 =
[mpenning@hotcoffee docs]$
ssty erase '^?'
? Если устройства настаивают на aC-h
, это не вызов telnet, а терминал (эмулятор).Ответы:
Я наконец-то нашел ответ в Зале позора Анны Баретты в Linux: кажется, что изменение назначения клавиш в
xterm
/rxvt
не приносит пользыtelnet
.Я подтвердил это, когда обнаружил соединение telnet. Сначала я понюхал сеанс telnet и увидел, что Backspaceотправлено
0x7f
на хост. Затем я намеренно сломал Backspaceвrxvt
использованииstty erase $
(таким образом , отображение моего Backspace на знак доллара вrxvt
). После этого мне пришлось нажать $Backspacerxvt
, ноtelnet
все равно отправил,0x7f
когда я использовал Backspaceна удаленном хосте.РЕШЕНИЕ
Создайте скрипт с именем
kbdfix
(ниже) и сделайте его исполняемым с755
разрешениями; вам потребуютсяtclsh
иexpect
пакеты , загруженные с вашего распределения архивов.Теперь для подключения к сломанным хостам я печатаю
kbdfix telnet 192.168.12.117 2006
и работаю Backspace.Обратите внимание, что для всех, кто был озадачен вышеприведенным 2006 годом ... это порт TCP, который сервер терминалов Cisco использует для последовательного соединения с консолью сломанного устройства (в данном случае коммутатор Brocade FCX).
Если вы просто подключаетесь к устройству, которое вам не нравится Backspace, вы должны использовать его
kbdfix telnet <addr_of_the_broken_device>
. Я также использую это с ssh, когда подключаюсь к коммутатору DLink DGS-3200 Ethernet с аналогичными проблемами; синтаксис естьkbdfix ssh 172.16.1.26
.источник
stty erase $
не отображает ключ «backspace» на «$», он сообщает драйверу tty, что для удаления символа необходимо использовать ключ «$». Когда вы запускаете telnet, вы находитесь в режиме raw, поэтому этот параметр игнорируется. Простое решение состоит в том, чтобы настроить ваш эмулятор терминала для отправки ^ H для возврата, как и предполагал Бог, другой использует ваш хак, который переводит этих символов на лету с использованием ожидаемого.stty
не менялtelnet
чтение с клавиатуры при использованииwireshark
; однако этот важный факт мне не был ясен, пока я не понюхал. Я выясню, как я могу изменить Backspace для использованияControl_h
вrxvt
... или, возможно, мне нужно подумать о поиске другого термина.stty
должен работать на стороне приложения. Я очень сомневаюсь,telnet
что перевод символов ввода или что вам нужно использоватьscript
; просто запускstty
на удаленной машине, вероятно, добьется цели.stty
.Enter
отправляете. Когда вы используете telnet, ваш терминал находится в режиме raw: каждый символ отправляется немедленно в приложение. Смотрите, например, начало этой страницы или эту статью в Википедии .Backspace и Control-H были спроектированы как одно и то же, но в настоящее время, особенно в Linux, вы часто отправляете backspace, удаляя и удаляя некоторую странную escape-последовательность.
В любом случае, насколько я знаю, telnet или переменная TERM не должны изменять то, что отправляет backspace, обычно это конфигурация эмулятора терминала.
источник
telnet
обращает внимания на локальные сопоставления терминалов клавиатуры. Заметки Анны Барреты о клавиатуре и телнетеПрограммы должны запрашивать параметры терминала , чтобы выяснить , что забой характер (
^h
и^?
, т.е.\010
и\177
, являются два варианта там). Используйтеstty erase '^h'
или,stty erase '^?'
чтобы объявить, что отправляет ваш терминал.Если вы входите удаленно (с помощью telnet, rsh или ssh) внутри терминала, обратите внимание, что вы должны работать
stty
на стороне приложения .stty
не говорит терминалу делать что-то другое, он сообщает локальному драйверу терминала (то есть части, которая взаимодействует с приложениями, работающими в терминале) о настройках терминала (исторически физический объект, теперь эмулятор терминала). Точно так же, если вы запускаете Screen или подобное программное обеспечение терминал-в-терминале, вам нужно запускатьstty
в каждом окне экрана (но обычно Screen может быть настроен на правильные действия из файла конфигурации, если он не работает из коробки). ).Различия в поведении, которые вы наблюдаете по
netcat
сравнению с другими,telnet
связаны с тем, как используется терминал: * В netcat терминал находится в построчном режиме (также называемом «режимом приготовления»). Вы редактируете строку (используя встроенную функцию редактирования локального терминала и, в частности, локальные настройки stty), а затем отправляете ее в окончательном состоянии на удаленный хост. * В telnet (локальный) терминал находится в посимвольном режиме (также называемом «сырым режимом»). Каждое нажатие клавиши направляется непосредственно в telnet, который немедленно передает его в удаленную систему. Вы зависите от функций линейного издания удаленной системы.Есть сломанные программы, которые не заботятся о настройках терминала. Похоже, вы столкнулись с одним из них. Лучше всего изменить конфигурацию вашего терминала. То же самое происходит, если вам нужно связаться с устройством через удаленный протокол, такой как telnet или SSH, и устройство не настраивается.
С xterm это просто: есть настройка для переключения символа, посылаемого BackSpaceклавишей во время выполнения. В меню левой кнопки переключите «Delete is DEL». Программно отправьте escape-последовательность
\e[?67h
для BackSpaceотправки^h
или\e[?67l
для BackSpaceотправки^?
. Соответствующий ресурс естьXTerm.backarrowKeyIsErase
. Другие эмуляторы терминала могут иметь или не иметь аналогичную интерфейсную функцию или поддерживать escape-последовательность.Многие эмуляторы терминала отправляют один из
^h
или^?
когда вы нажимаете BackSpace, и другой символ, когда вы нажимаете Ctrl+ BackSpace. Это может быть полезно в крайнем случае.Обратите внимание, что
showkeys
и друзья относятся только к консоли Linux, а не к X.источник