2 votes

Afficher les touches pressées dans la console personnalisée

J'ai un client personnalisé qui se connecte à Ubuntu à distance via websocket et y exécute bash. Mais les touches comme Del, Flèches etc. ne fonctionnent pas. Comment puis-je afficher ce qui est reçu du côté du serveur ? Aucune des solutions mentionnées dans afficher les touches pressées sous linux travail.

UPDATE : J'ai d'abord posé une question sur SSH, mais j'ai ensuite réalisé que je n'utilisais probablement pas SSH.

UPDATE2 : 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

En gros, j'ai besoin de quelque chose comme ça :

termbox keyboard demo

UPDATE3 : La communication entre le client et le serveur de la console se fait par le biais de websockets en Go. Sources - client y serveur .

0 votes

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".

0 votes

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 eu les yeux plus gros que le ventre ! Ce que vous faites essentiellement en vous connectant de cette manière est d'écrire un émulateur de terminal. Vous devez prendre en charge tout ce qu'un émulateur de terminal doit prendre en charge. Par exemple, depuis une machine Windows, vous pouvez utiliser PuTTY pour vous connecter à une machine Unix distante. PuTTY est un émulateur de terminal, vous devez donc faire tout ce que fait PuTTY. Vous devez donc mettre en œuvre le protocole TELNET.

0 votes

@ThomasDickey, question modifiée.

2voto

Thomas Dickey Points 8167

Le résultat montre 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 , Left-cursor etc.

Il n'est pas clair à quel "Del" le PO fait référence. J'ai les deux Delete y Del sur mon clavier (sur les claviers d'édition et numérique). Les deux pourraient 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 ordinaire.

Toutefois, la question posée websocket ce qui semble indiquer que le système fonctionne dans un navigateur Web. La capture d'écran montre un certain type de clavier à l'écran, avec DEL dans le clavier d'édition.

Si l'implémentation est complète, on pourrait s'attendre à ce que quelque chose comme ceci soit envoyé au Shell quand en appuyant sur cette touche, si vous appuyez d'abord sur controlV :

^[[3~

El ^[ est l'écho du caractère d'échappement ASCII ( control<code>[</code> ). Vous avez besoin de la controlV lnext pour empêcher le Shell de l'interpréter ou de le rejeter.

El lnext (littéral suivant) est une caractéristique de tout système de gestion de l'information. termios que vous êtes susceptible de rencontrer, mais qui curieusement n'est pas mentionné dans la norme POSIX, sauf comme réservé à une extension (voir la mention de VLNEXT ). Cependant, comme il s'agit d'une étiquette pour linux, la documentation Linux est ce que vous pouvez utiliser comme référence :

  • termios(3)

    Les fonctions termios décrivent une interface générale de terminal qui est fournie 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

0 votes

Quel est ce mécanisme Control+V ? Est-il pris en charge par tous les systèmes Linux ?

0 votes

Oui - c'est une fonctionnalité de tous les systèmes de type Unix.

0 votes

Je ne vois rien lorsque j'appuie sur F1, Flèches etc. après Ctrl-V, donc cela signifie à 100% que mon client ne l'envoie pas, n'est-ce pas ?

1voto

Sam Points 111

Je pense que tu dois prendre du recul et réfléchir à ce que tu essaies de faire. Vous n'avez pas été clair sur la façon dont vous vous connectez au serveur via WebSockets. Je suppose que vous vous connectez à un serveur WebSocket qui envoie par proxy la connexion au port telnet, n'est-ce pas (car les WebSockets ne peuvent se connecter qu'à des WebSockets) ? Vous pouvez jeter un coup d'oeil à la page Websockify qui contient un exemple de client telnet compatible VT100. Vous pourriez baser votre projet là-dessus.

0 votes

Voici le code du client. github.com/lxc/lxd/blob/ Je dois regarder plus profondément pour la partie serveur.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X