7

Я использую putty на win7 в качестве клиента, чтобы войти в ssh на сервере Debian. Но я столкнулся со странной проблемой поведения клавиатуры на консоли замазки.

Я заметил, что речь идет о конфигурации клавиатуры в замазке. После прочтения руководства по замазке, я успешно сделал клавишу backspace для работы, но все еще есть проблемы с ESC , стрелками, home и end и клавишами F1 - F12 .

Вот мой конфиг клавиатуры в замазке

Здесь я перечислю их поведение ниже. Кажется, что неправильное отображение ESC является основной причиной.

  • ESC => ^ [
  • up => ^ [О.А.
  • down => ^ [OB
  • right => ^ [OC
  • left => ^ [OD
  • home => ^ [[1 ~
  • end => ^ [[4 ~
  • F1 => ^ [[11 ~
  • F12 => ^ [[24 ~

================================================

Здесь я покажу, почему я думаю, что esc неправильно отображает:

Когда в правильно работающей консоли ssh я esc , он ничего не должен показывать.

(before)
root@somemachine:
(after)
root@somemachine:

Но в этой неисправной консоли ssh я esc , она показывает ^[ .

(before)
root@somemachine:
(after)
root@somemachine: ^[

Я запустил od -c на консоли ssh и нажал esc , они дали одинаковый вывод.

(normal one)
root@opengg:~# od -c
^[

(malfunctioning one)
$ od -c
^[

5 ответов5

13

Проблема заключается в том, что значение переменной среды TERM не соответствует настроенным характеристикам терминала - в частности, настройкам "Домой и клавиши завершения" и "Функциональные клавиши и клавиатура".

Это может быть трудно понять правильно.

Что ожидает сервер Debian.

Введите infocmp -I чтобы увидеть, что ожидает ваш компьютер.

$ infocmp -I 
#       Reconstructed via infocmp from file: /usr/share/terminfo/a/ansi
ansi|ansi/pc-term compatible with color,
        …
        rmul=\E[m, il1=\E[L, kbs=^H, kcbt=\E[Z, kcud1=\E[B,
        khome=\E[H, kich1=\E[L, kcub1=\E[D, kcuf1=\E[C, kcuu1=\E[A,
        …

khome=\E[H означает, что сервер ожидает получения трех символов ESC [ H при нажатии Home.

Вы можете посмотреть, что ожидается для других значений TERM

$ infocmp -I xterm
#       Reconstructed via infocmp from file: /usr/share/terminfo/x/xterm
xterm|X11 terminal emulator,
        …
        is2=\E[!p\E[?3;4l\E[4l\E>, il1=\E[L, ka1=\EOw, ka3=\EOu,
        kb2=\EOy, kbs=\177, kbeg=\EOE, kc1=\EOq, kc3=\EOs,
        kdch1=\E[3~, kcud1=\EOB, kend=\E[4~, kent=\EOM, kf1=\EOP,
        kf10=\E[21~, kf11=\E[23~, kf12=\E[24~, kf13=\E[25~,
        kf14=\E[26~, kf15=\E[28~, kf16=\E[29~, kf17=\E[31~,
        kf18=\E[32~, kf19=\E[33~, kf2=\EOQ, kf20=\E[34~, kf3=\EOR,
        kf4=\EOS, kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~,
        kf9=\E[20~, khome=\E[1~, kich1=\E[2~, kcub1=\EOD,
        kmous=\E[M, knp=\E[6~, kpp=\E[5~, kcuf1=\EOC, kcuu1=\EOA,
        …

Здесь вы можете видеть, что, если TERM был установлен на xterm , этот сервер ожидал бы получить ESC [ 1 ~ при нажатии Home (khome)

Если вышеупомянутое слишком загадочно, попробуйте infocmp -L

Вы также можете делать такие вещи, как tput khome | hexdump -C если вы знаете имена возможностей terminfo для ключей, которые вас интересуют.

$ tput khome | hexdump -C
00000000  1b 5b 48                                          |.[H|

или, возможно, более разборчиво

$ tput khome | hexdump -e '12/1 "%3_u" "\n"'
esc  [  H

или посмотреть, что может означать другой параметр TERM

$ TERM=xterm tput khome | hexdump -e '12/1 "%3_u" "\n"'
esc  [  1  ~

если вывод пуст, сервер думает, что у типа терминала (TERM) нет этого ключа.

Что на самом деле отправлено Putty.

Чтобы увидеть, что на самом деле отправляет Home , запустите vi , нажмите i (для режима вставки), нажмите Ctrl+V, затем нажмите Home и нажмите Esc, чтобы выйти из режима вставки.

Решение

Изменяйте конфигурацию Putty (или TERM) до тех пор, пока отправленное не будет соответствовать ожидаемому другому концу.


Например

Сделайте, как указано в https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/terminfo.html, затем в Putty, Configuration, Connection, Data, терминал типа string = PuTTY и сохраните его. Может быть.

2

Нет неправильного отображения клавиши ESC - ^ [означает Control-LeftSquareBracket, который является ASCII 27, который является ESC

Если вы подозреваете, что ключи дают неправильные последовательности, проверьте их с помощью od -c и сравните их с выводом infocmp :

 $ od -c
 (hit F1 Ctrl-D Ctrl-D)

Выход может быть (033 ESC):

 0000000 033   [   1   1   ~

Сравните это с выводом infocmp (здесь \E означает ESC):

 $ infocmp -1 | grep 'kf1='
    kf1=\E[11~,

Краткое введение в вывод infocmp:

kbs = Backspace

kcub1 , kcud1 , kcuf1 , kcuu1 = клавиши курсора

kf * = функциональные клавиши

kpp / knp = Страница вверх / вниз

khome / kend = клавиши Home / End

kich1 / kdch1 = Вставить / Удалить ключи

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

1

По моему опыту, это потому, что bash не работает, просто запустите /bin/bash, чтобы насладиться цветами, историей и многим другим. Кроме того, эти глюки исчезают, заставляя клавиатуру работать как положено.

Возможно, вам придется запускать эту команду каждый раз, когда вы подключаетесь или меняете пользователя, но это не сложно запомнить.

0

Пока вы не найдете полное решение, попробуйте использовать клавиши в стиле vi вместо стрелок.
H => слева
J => вниз
и т.п.

0

Конечно, есть "рецепт", но разработчики PuTTY решили не участвовать в этом процессе. Рецепт называется описанием терминала. С 2001 года в ncurses есть подходящий (см. Ссылку, например, на базу данных терминала).

Описание терминала указывается для большинства приложений в качестве переменной среды TERM .

Вместо того, чтобы использовать этот "рецепт", PuTTY по умолчанию устанавливает TERM в значение xterm, которое, как вы заметили, не соответствует специальным клавишам (функция, курсор). Это упомянуто в FAQ по ncurses. Почему бы просто не использовать TERM со значением "xterm"?

PuTTY также упоминается (из-за проблемы с TERM) в FAQ по xterm, хотя нет никакого раздела, посвященного этому, потому что на самом деле это не "xterm".

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .