Заставить 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, обычно это конфигурация эмулятора терминала.


Ваш вопрос основан на предположении, что 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.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.