Mostra as teclas pressionadas no console personalizado

2

Eu tenho um cliente personalizado que se conecta ao Ubuntu remoto via websocket e executa o bash lá. Mas chaves como Del, Arrows etc. não funcionam. Como posso produzir o que está sendo recebido no lado do servidor? Nenhuma das soluções mencionadas em mostram as teclas pressionadas no trabalho do linux .

UPDATE : primeiro fiz uma pergunta sobre o SSH, mas depois percebi que provavelmente não estou usando o SSH.

UPDATE2 : O que eu tentei?

# 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

Basicamente, eu preciso de algo assim:

UPDATE3:AcomunicaçãoentreoclienteeoservidordoconsoleéfeitaatravésdewebsocketsnoGo.Fontes- cliente e server .

    
por anatoly techtonik 08.11.2015 / 12:31

2 respostas

2

O resultado mostrando stty -a foi promissor, mas nem a questão nem a outra resposta apontavam para a maneira usual de encontrar o que é enviado por uma chave especial como Del , cursor , etc.

Não está claro qual OP "Del" está se referindo. Eu tenho as duas teclas Delete e Del no meu teclado (nos teclados numérico e de edição). Ambos poderiam enviar uma série de bytes de dados começando com ESC (o caractere de escape ASCII). Ou seja, em um terminal regular.

No entanto, a questão se refere a websocket , que soa como se estivesse sendo executado em um navegador da web. A captura de tela mostra algum tipo de teclado na tela, com DEL no teclado de edição.

Se a implementação estiver completa, pode-se esperar que algo como isto seja enviado para o shell quando pressionar a tecla, se você pressionar controle V :

^[[3~

O ^[ é o caractere de escape ASCII ecoado ( controle [ ). Você precisa do caractere de controle V lnext para evitar que o shell o interprete ou jogue fora.

A configuração lnext (literal seguinte) é um recurso de quaisquer termios que você provavelmente encontrará, mas estranhamente não mencionado no padrão POSIX, exceto como reservado para uma extensão (veja a menção de VLNEXT ). No entanto, como isso é marcado para o linux, a documentação do Linux é o que você pode usar como referência:

  • termios (3)

    The termios functions describe a general terminal interface that is provided to control asynchronous communications ports.

  • stty (1)

    Print or change terminal characteristics.

Você pode vê-lo na saída de stty -a , ou seja, no quarto linha de saída neste exemplo:

$ 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
    
por 08.11.2015 / 21:01
1

Acho que você precisa dar um passo para trás e pensar sobre o que está tentando fazer. Você não estava claro sobre como você está se conectando ao servidor através de WebSockets. Eu estou supondo que você está se conectando a um servidor WebSocket que está fazendo o proxy da conexão com a porta telnet, está certo (porque WebSockets só pode se conectar a WebSockets)? Você pode querer dar uma olhada no projeto Websockify que tem um exemplo de cliente telnet compatível com VT100. Você poderia basear seu projeto fora disso.

    
por 10.11.2015 / 00:25