Forcer telnet / ssh à utiliser crtl-H pour le retour arrière

9

J'ai certains appareils connectés à un serveur Cisco de terme série; beaucoup fonctionnent bien quand je telnetdirectement au port sur le Cisco. Cependant, j'ai quelques appareils tenaces qui ne seront pas utilisés Backspacecar ils sont mappés dans telnet par défaut.

Au cas où cela compte, je telnet rxvtsous la compression Debian (dans une fenêtre X). TERMest réglé sur rxvt, mais il n'a pas d' importance si je l' utilise vt100, vt101ou xterm... changement TERMn'a pas d' effet. J'ai commencé sur la voie du changement en TERMfonction de ce que j'ai vu dans une ancienne FAQ Kermit . FWIW, stty erase ^het stty erase ^?ne fonctionnent pas non plus.

J'ai remarqué que cela Backspacefonctionne correctement sur ces appareils si j'utilise un socket TCP brut de netcat... ie nc 192.168.12.117 2006; cependant, je rencontre d'autres problèmes avec des mots de passe non masqués ou la pagination du terminal.

Comment puis - je forcer sélectivement telnet et ssh à la carte Backspaceà CtrlHces dispositifs? De plus, quels critères dois-je utiliser pour évaluer s'il s'agit d'un bogue dans l'appareil?

ÉDITER

Dans le cas où cela est important, c'est la sortie de showkey -apour les touches en question ... ^?correspond à Backspaceet ^Hest CtrlH. Il semble que je devrais être proche quand je regarde le Linux Keyboard and Console Howto , mais je n'arrive pas à déchiffrer ce que je peux faire pour changer cela. J'ai essayé diverses incantations loadkeyssans résultat.

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

^?      127 0177 0x7f
^H        8 0010 0x08

J'inclus également les sorties pertinentes de dumpkeys... c'est le mappage actuel dans mon système (qui ne fonctionne pas sur certains appareils en question). Si je pouvais comprendre comment Backspacefaire la même chose que CtrlH, j'aurais une solution.

[mpenning@hotcoffee docs]$ sudo dumpkeys | grep -Ei "backspace|127"
keycode   8 = BackSpace        ampersand        braceleft       
keycode  14 = BackSpace        Delete          
        control keycode  14 = BackSpace       
keycode 127 =
[mpenning@hotcoffee docs]$
Mike Pennington
la source
1
As-tu essayé ssty erase '^?'? Si les appareils insistent sur C-hce n'est pas l'appel de telnet, c'est celui du terminal (émulateur).
Gilles 'SO- arrête d'être méchant'
@Gilles votre commentaire n'est pas correct, voir ma réponse ci
Mike Pennington

Réponses:

10

J'ai finalement trouvé une réponse dans le Hall of Shame du clavier Linux d'Anne Baretta ... il semble que changer les mappages de touches dans xterm/ rxvtne sert à rientelnet .

J'ai validé ceci quand j'ai reniflé la connexion telnet. J'ai d'abord reniflé la session telnet et vu celle Backspaceenvoyée 0x7fà l'hôte. Ensuite , je cassé intentionnellement Backspaceen rxvtutilisant stty erase $(cartographie ainsi mon Backspace le signe du dollar rxvt). Après avoir fait cela, j'ai dû frapper $pour revenir en arrière rxvt, mais telnettoujours envoyé 0x7florsque je l'ai utilisé Backspacesur l'hôte distant.

SOLUTION

Créez un script appelé kbdfix(ci-dessous) et rendez-le exécutable avec des 755autorisations; vous aurez besoin des packages tclshet expectchargés à partir de vos archives de distribution.

#!/usr/bin/expect

#Name this file as kbdfix and make it executable in your path
eval spawn -noecho $argv

interact {
 \177        {send "\010"}
 "\033\[3~"  {send "\177"}
}

Maintenant, pour me connecter aux hôtes cassés, je tape kbdfix telnet 192.168.12.117 2006et ça Backspacemarche.

Remarque pour toute personne confondue en 2006 ci-dessus ... c'est le port TCP que le serveur de termes Cisco utilise pour la connexion série à la console du périphérique cassé (dans ce cas, un commutateur Brocade FCX).

Si vous vous contentez de téléphoner à un appareil qui n'aime pas Backspace, vous utiliseriez kbdfix telnet <addr_of_the_broken_device>. J'utilise également ceci avec ssh lorsque je ssh vers un commutateur Ethernet DLink DGS-3200 qui a des problèmes similaires; la syntaxe est kbdfix ssh 172.16.1.26.

Mike Pennington
la source
2
stty erase $ne mappe pas la clé "backspace" à "$", elle indique au pilote tty que pour effacer un caractère, la clé "$" doit être utilisée. Lorsque vous exécutez telnet, vous êtes en mode brut, ce paramètre est donc ignoré. Une solution simple serait de configurer votre émulateur de terminal pour envoyer ^ H pour le retour arrière, comme Dieu le voulait, un autre utilise votre hack qui traduit ces caractères à la volée en utilisant expect.
jlliagre
@jlliagre, oui, j'ai découvert comment sttyne changeait pas telnetles lectures du clavier quand j'utilisais wireshark; cependant, ce fait important n'était pas clair pour moi jusqu'à ce que je renifle. J'examinerai comment je peux changer Backspace pour l'utiliser Control_hdans rxvt... ou peut-être que je dois penser à trouver un autre terme.
Mike Pennington
@Mike: Je pense que vous êtes toujours confus à propos de quelque chose (que je n'admets ni jlliagre ni que j'ai mentionné explicitement; j'ai mis à jour ma réponse). sttydoit s'exécuter côté application. Je doute fortement de telnettraduire des caractères saisis ou que vous devez utiliser script; simplement exécuter sttysur la machine distante fera probablement l'affaire.
Gilles 'SO- arrête d'être méchant'
@Gilles, la machine distante est un périphérique réseau, elle n'en a pas stty.
Mike Pennington
1
@Mike: Lorsque vous utilisez netcat, votre terminal est en mode cuit: vous écrivez une ligne, la modifiez localement et l' Enterenvoyez. Lorsque vous utilisez telnet, votre terminal est en mode brut: chaque caractère est envoyé immédiatement à l'application. Voir par exemple le début de cette page , ou cet article Wikipedia .
Gilles 'SO- arrête d'être méchant'
3

Backspace et Control-H ont été conçus pour être la même chose, mais de nos jours, en particulier sous Linux, vous avez souvent un retour arrière en supprimant et en supprimant l'envoi d'une séquence d'échappement étrange.

Dans tous les cas et pour autant que je sache, telnet ou la variable TERM ne devrait pas changer ce que le backspace envoie, c'est généralement une fonction de configuration de l'émulateur de terminal.

jlliagre
la source
Votre question est basée sur l'hypothèse que telnet effectue un traitement spécifique de la clé de retour arrière qui, selon moi, est erroné. J'aurais dû mettre cela en commentaire plutôt qu'en réponse.
jlliagre
AFAICT, telnetne prête aucune attention aux mappages de terminaux locaux du clavier. Notes d'Anne Barreta sur le clavier et le telnet
Mike Pennington
Je crains que vous ne compreniez bien ce que fait stty.
jlliagre
3

Les programmes sont censés interroger les paramètres du terminal pour savoir quel est le caractère de retour arrière ( ^het ^?, par exemple\010 -à- et \177, sont les deux choix disponibles). Utilisez stty erase '^h'ou stty erase '^?'pour déclarer ce que votre terminal envoie.

Si vous vous connectez à distance (avec telnet, rsh ou ssh) à l'intérieur du terminal, notez que vous devez exécuter stty côté application . sttyne dit pas au terminal de faire quelque chose de différent, il informe le pilote de terminal local (c'est-à-dire la partie qui s'interface avec les applications s'exécutant dans le terminal) des paramètres du terminal (historiquement un objet physique, maintenant un émulateur de terminal). De même, si vous exécutez Screen ou un logiciel terminal-in-terminal similaire, vous devez exécuter sttydans chaque fenêtre d'écran (mais généralement Screen peut être configuré pour faire la bonne chose à partir de son fichier de configuration, si cela ne fonctionne pas hors de la boîte ).

La différence de comportement que vous observez par netcatrapport à vs telnetest due à la façon dont le terminal est utilisé: * Dans netcat, le terminal est en mode ligne par ligne (également appelé «mode cuit»). Vous éditez une ligne (en utilisant la fonction d'édition intégrée du terminal local, et donc en particulier les paramètres stty locaux), puis l'envoyez dans son état final à l'hôte distant. * Dans telnet, le terminal (local) est en mode caractère par caractère (également appelé «mode brut»). Chaque frappe va directement à telnet qui la relaie immédiatement au système distant. Vous dépendez des fonctions d'édition en ligne du système distant.

Il existe des programmes défectueux qui ne se soucient pas des paramètres du terminal. On dirait que vous en avez rencontré un. Le mieux est de changer la configuration de votre terminal. Il en va de même si vous devez communiquer avec un appareil via un protocole distant tel que telnet ou SSH et que l'appareil n'est pas configurable.

Avec xterm, c'est facile: il y a un paramètre pour basculer le caractère envoyé par la BackSpaceclé au moment de l'exécution. Dans le menu du bouton gauche, basculez «Supprimer est SUPPR». Par programme, envoyez la séquence d'échappement \e[?67h à BackSpaceenvoyer ^hou \e[?67là BackSpaceenvoyer ^?. La ressource correspondante est XTerm.backarrowKeyIsErase. D'autres émulateurs de terminal peuvent ou non avoir une fonction d'interface similaire ou prendre en charge la séquence d'échappement.

De nombreux émulateurs de terminal envoient l'un ^hou ^?lorsque vous appuyez sur BackSpace, et l'autre caractère lorsque vous appuyez sur Ctrl+ BackSpace. Cela peut être utile à la rigueur.

Notez que showkeyset les amis ne sont pertinents que sur la console Linux, pas dans X.

Gilles 'SO- arrête d'être méchant'
la source