Примушуйте telnet / ssh використовувати crtl-H для зворотного простору


9

У мене є деякі пристрої, підключені до сервера послідовних термінів Cisco; багато хто працює добре, коли я telnetпрямо в порт на Cisco. Однак у мене є кілька впертих пристроїв, які не використовуватимуть, Backspaceоскільки вони за замовчуванням відображені в telnet.

У випадку, якщо це має значення, я telnet з- rxvtпід Debian видавлюю (у X Window). TERMвстановлений на rxvt, але це не має значення , чи використовую я vt100, vt101або xterm... зміна TERMне має ніякого ефекту. Я почав змінюватись TERMна основі того, що я бачив у старому FAQ Керміта . FWIW, stty erase ^hі stty erase ^?не працює.

Я помітив, що Backspaceпрацює на цих пристроях правильно, якщо я використовую необроблений сокет TCP від netcat... тобто nc 192.168.12.117 2006; однак тоді я стикаюся з іншими проблемами із паролями, які не є прихованими, або термінальним пейджингом.

Як я можу вибірково змусити Telnet і SSH до карти , Backspaceщоб CtrlHдля цих пристроїв? Крім того, які критерії я повинен використовувати, щоб оцінити, чи це помилка в пристрої?

EDIT

У випадку, якщо це має значення, це висновок з showkey -aдля ключових питань, про які йдеться ... ^?відповідає Backspaceі ^Hє CtrlH. Здається, мені слід наблизитися, коли я дивлюся на клавіатуру Linux та 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 '^?'? Якщо пристрої наполягають на а C-h, це не дзвінок telnet, це термінал (емулятор).
Жиль 'ТАК - перестань бути злим'

@Gilles ваш коментар насправді невірний, дивіться мою відповідь нижче
Майк Пеннінгтон

Відповіді:


10

Нарешті я знайшов відповідь у «Залі сорому» Енн Баретти в клавіатурі Linux ... здається, що зміна ключових відображень в xterm/ rxvtне приносить користіtelnet .

Я підтвердив це, коли обнюхав з'єднання telnet. Спочатку я обнюхав сеанс telnet і побачив, що Backspaceнадсилається 0x7fхосту. Далі я навмисно вмикався Backspaceу rxvtвикористанні stty erase $(таким чином відображаючи мій Backspace на знак вступу в долар rxvt). Зробивши це, мені довелося перейти $до зворотного простору 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, ви перебуваєте в сирому режимі, тому цей параметр ігнорується. Простим рішенням буде налаштувати свій емулятор терміналу для надсилання ^ H для зворотної області, як Бог задумав, інший використовує ваш хак, який перекладає цих символів на льоту, використовуючи очікувані.
jlliagre

@jlliagre, так, я виявив, як sttyне змінив telnetчитання клавіатури, коли я використовував wireshark; однак цей важливий факт був мені незрозумілим, поки я не обнюхав. Я досліджу, як я можу змінити Backspace на використання Control_hв rxvt... або, можливо, мені потрібно подумати про пошук іншого терміна.
Майк Пеннінгтон

@Mike: Я думаю, ти все ще плутаєшся про щось (про що я не визнаю ні jlliagre, ні я прямо не згадав; я оновив свою відповідь). sttyпотрібно запустити на стороні програми. Я дуже сумніваюся telnetв перекладі вхідних символів або в тому, що вам потрібно використовувати script; просто біг sttyна віддаленій машині, ймовірно, зробить трюк.
Жиль "ТАК - перестань бути злим"

@Gilles, віддалений апарат - це мережевий пристрій, його немає stty.
Майк Пеннінгтон

1
@Mike: Коли ви користуєтесь netcat, ваш термінал знаходиться в приготовленому режимі: ви пишете рядок, редагуючи його локально , і Enterвідправляєте його. Коли ви використовуєте telnet, ваш термінал перебуває в режимі "необроблений": кожен символ негайно надсилається до програми. Див., Наприклад, початок цієї сторінки або цю статтю у Вікіпедії .
Жиль "ТАК - перестань бути злим"

3

Backspace і Control-H були розроблені як одне і те ж, але в наш час, особливо в Linux, ви часто надсилаєте резервне простір видалення і видалення відправки деякої незвичайної послідовності втечі.

У будь-якому випадку, і наскільки я знаю, telnet або змінна TERM не повинні змінювати те, що надсилає зворотний простір, зазвичай це функція конфігурації емулятора терміналу.


Ваше запитання ґрунтується на припущенні, що telnet проводить конкретну обробку клавіші зворотного простору, яка, на мою думку, є неправильною. Я мав би поставити це як коментар, а не відповідь.
jlliagre

AFAICT, telnetне звертає уваги на місцеві термінальні відображення клавіатури. Записки Енн Баррета про клавіатуру та телнет
Майк Пеннінгтон

Боюся, ти не розумієш, що робить Стіті.
jlliagre

3

Програми повинні запитувати параметри терміналу , щоб з'ясувати , що забій характер ( ^hі ^?, тобто \010і \177, є два варіанти там). Використовуйте stty erase '^h'або stty erase '^?'оголошуйте, що надсилає ваш термінал.

Якщо ви входите віддалено (за допомогою telnet, rsh або ssh) всередині терміналу, зауважте, що потрібно запуститись stty на стороні програми . sttyне говорить терміналу робити щось інше, він інформує локальний драйвер терміналу (тобто частину, яка взаємодіє з програмами, що працюють в терміналі) про налаштування терміналу (історично фізичний об'єкт, тепер емулятор терміналу). Аналогічно, якщо ви запускаєте Screen або подібне програмне забезпечення для sttyвходу в термінал, вам потрібно запуститись у кожному вікні екрана (але зазвичай екран може бути налаштований на те, щоб зробити правильно з конфігураційного файлу, якщо він не працює з поля ).

Різниця в поведінці, яку ви спостерігаєте від netcatvs. telnet, пов’язана з тим, як використовується термінал: * У мережі netcat термінал знаходиться в почерговому режимі (його також називають "приготовлений режим"). Ви редагуєте рядок (використовуючи вбудовану функцію видання місцевого терміналу, і, зокрема, локальні настройки stty), після чого надсилаєте їх у остаточному стані віддаленому хосту. * У telnet (локальний) термінал перебуває в режимі символів за символом (його також називають "необроблений режим"). Кожен натискання клавіші переходить безпосередньо до telnet, який негайно передає його у віддалену систему. Ви залежні від особливостей видання рядкової віддаленої системи.

Там є зламані програми, які не цікавляться налаштуваннями терміналу. Схоже, ви стикалися з одним із них. Краще всього змінити конфігурацію свого терміналу. Те ж саме, якщо вам потрібно спілкуватися з пристроєм через віддалений протокол, такий як telnet або SSH, і пристрій не налаштовується.

З xterm це просто: є налаштування для перемикання символу, надісланого BackSpaceключем під час виконання. У меню лівої кнопки перемкніть "Видалити це DEL". Програмний, послати керуючу послідовність \e[?67h , щоб BackSpaceвідправити ^hабо \e[?67lотримати BackSpaceпосил ^?. Відповідний ресурс є XTerm.backarrowKeyIsErase. Інші емулятори терміналів можуть мати або не мати подібну функцію інтерфейсу або підтримувати послідовність виходу.

Багато емуляторів терміналів надсилають один із ^hабо ^?при натисканні BackSpace, а інший символ, коли ви натискаєте Ctrl+ BackSpace. Це може бути корисно в дрібному вигляді.

Зауважте, що showkeysдрузі стосуються лише консолі Linux, а не X.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.