2

У меня есть собственный клиент, который подключается к удаленной Ubuntu через websocket и запускает там bash. Но такие ключи, как Del, Arrows и т.д. Не работают. Как вывести то, что получено на стороне сервера? Ни одно из решений, указанных в клавишах show, нажатых в linux, не работает.

ОБНОВЛЕНИЕ: я сначала задал вопрос о SSH, но позже понял, что я, вероятно, не использую SSH.

ОБНОВЛЕНИЕ 2: Что я попробовал.

# showkey
Couldn't get a file descriptor referring to the console

# evtest
No device specified, trying to scan all of /dev/input/event*
USAGE:
 Capture mode:
   evtest [--grab] /dev/input/eventX
     --grab  grab the device for exclusive access

 Query mode: (check exit code)
   evtest --query /dev/input/eventX <type> <value>

<type> is one of: EV_KEY, EV_SW, EV_LED, EV_SND
<value> can either be a numerical value, or the textual name of the
key/switch/LED/sound being queried (e.g. SW_DOCK).


# ls /dev/input
ls: cannot access /dev/input: No such file or directory


# stty -a
speed 38400 baud; rows 300; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc ixany imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

В принципе, мне нужно что-то вроде этого:

демонстрация клавиатуры Termbox

ОБНОВЛЕНИЕ 3: Связь между консольным клиентом и сервером осуществляется через веб-сокеты в Go. Источники - клиент и сервер.

2 ответа2

2

Результат, показывающий stty -a был многообещающим, но ни вопрос, ни другой ответ не указывали на обычный способ найти то, что отправляется специальной клавишей, такой как Del, левый курсор и т.д.

Непонятно, на что ссылается "Del". У меня есть клавиши Delete и Del на моей клавиатуре (на клавиатурах редактирования и числовых клавиатурах). Оба могут отправлять серию байтов данных, начинающихся с ESC (escape-символ ASCII). То есть в обычном терминале.

Однако этот вопрос относится к веб-сокету, который звучит так, как будто он работает в веб-браузере. На снимке экрана показан тип экранной клавиатуры с DEL на клавиатуре редактирования.

Если реализация завершена, можно ожидать, что что-то подобное будет отправлено в оболочку при нажатии этой клавиши, если вы сначала нажмете элемент управления V:

^[[3~

^[ - это экранированный символ ASCII (control [)). Вам нужен управляющий символ V lnext, чтобы оболочка не могла его интерпретировать или выбросить.

Параметр lnext (буквальный следующий) является функцией любых терминов, с которыми вы можете столкнуться, но, как ни странно, не упоминается в стандарте POSIX, за исключением случаев, когда он зарезервирован для расширения (см. Упоминание VLNEXT). Однако, поскольку это помечено для linux, документацию по Linux можно использовать для справки:

  • termios(3)

    Функции termios описывают общий интерфейс терминала, который предназначен для управления асинхронными коммуникационными портами.

  • Запущенная (1)

    Распечатать или изменить характеристики терминала.

Вы можете увидеть это в выводе stty -a, то есть в четвертой строке вывода в этом примере:

$ stty -a
speed 38400 baud; rows 40; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke
1

Я думаю, вам нужно сделать шаг назад и подумать о том, что вы пытаетесь сделать. Вы не поняли, как вы подключаетесь к серверу через WebSockets. Я предполагаю, что вы подключаетесь к серверу WebSocket, который проксирует соединение с портом telnet, это правильно (потому что WebSockets может подключаться только к WebSockets)? Возможно, вы захотите взглянуть на проект Websockify, в котором есть пример клиента Telnet, совместимого с VT100. Вы можете основать свой проект на этом.

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