Question Afficher les touches enfoncées dans la console personnalisée


J'ai un client personnalisé qui se connecte à Ubuntu via websocket et exécute bash là-bas. Mais les touches comme Del, Arrows etc. ne fonctionnent pas. Comment puis-je générer ce qui est reçu du côté serveur? Aucune des solutions mentionnées dans montrer les touches pressées dans linux travail.

METTRE À JOUR: J'ai d'abord posé une question sur SSH, mais je me suis rendu compte plus tard que je n'utilisais probablement pas SSH.

MISE À JOUR2: Qu'est-ce que j'ai essayé?

# 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

Au fond, j'ai besoin de quelque chose comme ça:

termbox keyboard demo

MISE À JOUR3: La communication entre le client console et le serveur se fait via les Websockets dans Go. Sources - client et serveur.


2
2017-11-08 11:31


origine


Vous avez donné la moitié de la question: nous ne savons pas ce que vous avez essayé et quel a été le résultat. Si vous étiez connecté en tant que (pseudo) terminal, la partie ctrl + V vous dirait quelque chose, tout comme "stty -a". - Thomas Dickey
Comment vous connectez-vous au serveur? Vous connectez-vous au port 23? Cela signifie que vous utilisez telnet. Si vous ne savez pas si vous utilisez SSH ou telnet, je pense que vous avez peut-être mordu plus que vous ne pouvez mâcher! Ce que vous faites essentiellement en vous connectant comme ceci, c'est en écrivant un émulateur de terminal. Vous devez prendre en charge tout ce qu'un émulateur de terminal doit prendre en charge. Par exemple, sur une machine Windows, vous pouvez utiliser PuTTY pour vous connecter à un ordinateur Unix distant. PuTTY est un émulateur de terminal, vous devez donc faire tout ce que fait PuTTY. Vous devez donc implémenter le protocole TELNET. - Sam
@ ThomasDickey, question édité. - anatoly techtonik
@Sam, le code est ici github.com/lxc/lxd/blob/ - il utilise des websockets. - anatoly techtonik


Réponses:


Le résultat montrant stty -a était prometteur, mais ni la question ni l’autre réponse n’indiquaient la manière habituelle de trouver ce qui est envoyé par une clé spéciale telle que Del, Curseur gauche, etc.

On ne sait pas à quel "Del" OP fait référence. j'ai les deux Effacer et Del touches sur mon clavier (sur les pavés numériques et d'édition). Les deux pouvaient envoyer une série d’octets de données commençant par ESC (le caractère d'échappement ASCII). C'est-à-dire dans un terminal régulier.

Cependant, la question mentionnée websocket, qui sonne comme s’il est exécuté dans un navigateur Web. La capture d'écran montre un type de clavier à l'écran, avec DEL dans le clavier d'édition.

Si l'implémentation est terminée, on pourrait s'attendre à ce que quelque chose comme ceci soit envoyé au shell lorsque pressage cette touche, si vous appuyez d'abord sur contrôleV:

^[[3~

le ^[ est le caractère d'échappement ASCII renvoyé (contrôle[). Vous avez besoin du contrôleV  lnext caractère pour empêcher le shell de l’interpréter ou de le jeter.

le lnext (littéral suivant) le réglage est une caractéristique de tout termios que vous êtes susceptible de rencontrer, mais bizarrement pas mentionné dans la norme POSIX sauf comme réservé à une extension (voir la mention de VLNEXT). Cependant, étant donné qu’elle est balisée pour Linux, la documentation Linux est ce que vous pouvez utiliser pour une référence:

  • termios (3)

    Les fonctions termios décrivent une interface de terminal générale   fourni pour contrôler les ports de communication asynchrones.

  • stty (1)

    Imprimer ou modifier les caractéristiques du terminal.

Vous pouvez le voir dans la sortie de stty -a, c'est-à-dire dans la quatrième ligne de sortie dans cet exemple:

$ 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

2
2017-11-08 20:01



Qu'est-ce que ce mécanisme Control + V? Est-ce quelque chose supporté par tous les Linux? - anatoly techtonik
Oui, c'est une caractéristique de tous les systèmes Unix. - Thomas Dickey
Je ne vois rien quand j'appuie sur F1, les flèches, etc. après Ctrl-V, de sorte que 100% signifie que mon client ne l'envoie pas, n'est-ce pas? - anatoly techtonik
Cela semble correct - la mise en œuvre du clavier peut être incomplète. - Thomas Dickey


Je pense que vous devez prendre du recul et réfléchir à ce que vous essayez de faire. Vous n'avez pas bien compris comment vous vous connectez au serveur via WebSockets. Je suppose que vous vous connectez à un serveur WebSocket qui transmet la connexion au port Telnet, est-ce exact (car WebSockets ne peut se connecter qu'à WebSockets)? Vous voudrez peut-être jeter un oeil à la Websockify projet qui a un exemple de client telnet compatible VT100. Vous pourriez baser votre projet sur cela.


1
2017-11-09 23:25



Voici le code client. github.com/lxc/lxd/blob/ J'ai besoin de chercher plus profondément la partie serveur. - anatoly techtonik