Заставить telnet / ssh использовать crtl-H для возврата

9

У меня есть несколько устройств, подключенных к серверу последовательных терминалов 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]$
Майк Пеннингтон
источник
1
Ты пробовал ssty erase '^?'? Если устройства настаивают на a C-h, это не вызов telnet, а терминал (эмулятор).
Жиль "ТАК - перестань быть злым"
@ Жиль, твой комментарий на самом деле не верный, см. Мой ответ ниже
Майк Пеннингтон

Ответы:

10

Я наконец-то нашел ответ в Зале позора Анны Баретты в Linux: кажется, что изменение назначения клавиш в xterm/ rxvtне приносит пользыtelnet .

Я подтвердил это, когда обнаружил соединение telnet. Сначала я понюхал сеанс telnet и увидел, что Backspaceотправлено 0x7fна хост. Затем я намеренно сломал Backspaceв rxvtиспользовании stty erase $(таким образом , отображение моего Backspace на знак доллара в rxvt). После этого мне пришлось нажать $Backspace rxvt, но telnetвсе равно отправил, 0x7fкогда я использовал Backspaceна удаленном хосте.

РЕШЕНИЕ

Создайте скрипт с именем kbdfix(ниже) и сделайте его исполняемым с 755разрешениями; вам потребуются tclshи expectпакеты , загруженные с вашего распределения архивов.

#!/usr/bin/expect

#Name this file as kbdfix and make it executable in your path
eval spawn -noecho $argv

interact {
 \177        {send "\010"}
 "\033\[3~"  {send "\177"}
}

Теперь для подключения к сломанным хостам я печатаю 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.

Майк Пеннингтон
источник
2
stty erase $не отображает ключ «backspace» на «$», он сообщает драйверу tty, что для удаления символа необходимо использовать ключ «$». Когда вы запускаете telnet, вы находитесь в режиме raw, поэтому этот параметр игнорируется. Простое решение состоит в том, чтобы настроить ваш эмулятор терминала для отправки ^ H для возврата, как и предполагал Бог, другой использует ваш хак, который переводит этих символов на лету с использованием ожидаемого.
Jlliagre
@jlliagre, да, я обнаружил, как sttyне менял telnetчтение с клавиатуры при использовании wireshark; однако этот важный факт мне не был ясен, пока я не понюхал. Я выясню, как я могу изменить Backspace для использования Control_hв rxvt... или, возможно, мне нужно подумать о поиске другого термина.
Майк Пеннингтон
@Mike: я думаю, что вы все еще смущены чем-то (о чем я не признаюсь ни в jlliagre, ни в явном виде; я обновил свой ответ). sttyдолжен работать на стороне приложения. Я очень сомневаюсь, telnetчто перевод символов ввода или что вам нужно использовать script; просто запуск sttyна удаленной машине, вероятно, добьется цели.
Жиль "ТАК - перестань быть злым"
@ Жиль, удаленная машина является сетевым устройством, его нет stty.
Майк Пеннингтон
1
@Mike: когда вы используете netcat, ваш терминал находится в готовом режиме: вы пишете строку, редактируете ее локально и Enterотправляете. Когда вы используете telnet, ваш терминал находится в режиме raw: каждый символ отправляется немедленно в приложение. Смотрите, например, начало этой страницы или эту статью в Википедии .
Жиль "ТАК - перестань быть злым"
3

Backspace и Control-H были спроектированы как одно и то же, но в настоящее время, особенно в Linux, вы часто отправляете backspace, удаляя и удаляя некоторую странную escape-последовательность.

В любом случае, насколько я знаю, telnet или переменная TERM не должны изменять то, что отправляет backspace, обычно это конфигурация эмулятора терминала.

jlliagre
источник
Ваш вопрос основан на предположении, что telnet выполняет определенную обработку клавиши Backspace, что я считаю неправильным. Я должен был поставить это как комментарий, а не как ответ.
Jlliagre
AFAICT, не telnetобращает внимания на локальные сопоставления терминалов клавиатуры. Заметки Анны Барреты о клавиатуре и телнете
Майк Пеннингтон
Боюсь, вы неправильно понимаете, что делает stty.
Jlliagre
3

Программы должны запрашивать параметры терминала , чтобы выяснить , что забой характер ( ^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.

Жиль "ТАК - перестань быть злым"
источник