J'ai certains appareils connectés à un serveur Cisco de terme série; beaucoup fonctionnent bien quand je telnet
directement 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 rxvt
sous la compression Debian (dans une fenêtre X). TERM
est réglé sur rxvt
, mais il n'a pas d' importance si je l' utilise vt100
, vt101
ou xterm
... changement TERM
n'a pas d' effet. J'ai commencé sur la voie du changement en TERM
fonction de ce que j'ai vu dans une ancienne FAQ Kermit . FWIW, stty erase ^h
et 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 -a
pour les touches en question ... ^?
correspond à Backspaceet ^H
est 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 loadkeys
sans 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]$
ssty erase '^?'
? Si les appareils insistent surC-h
ce n'est pas l'appel de telnet, c'est celui du terminal (émulateur).Réponses:
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
/rxvt
ne 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 Backspaceenrxvt
utilisantstty erase $
(cartographie ainsi mon Backspace le signe du dollarrxvt
). Après avoir fait cela, j'ai dû frapper $pour revenir en arrièrerxvt
, maistelnet
toujours envoyé0x7f
lorsque je l'ai utilisé Backspacesur l'hôte distant.SOLUTION
Créez un script appelé
kbdfix
(ci-dessous) et rendez-le exécutable avec des755
autorisations; vous aurez besoin des packagestclsh
etexpect
chargés à partir de vos archives de distribution.Maintenant, pour me connecter aux hôtes cassés, je tape
kbdfix telnet 192.168.12.117 2006
et ç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 estkbdfix ssh 172.16.1.26
.la source
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.stty
ne changeait pastelnet
les lectures du clavier quand j'utilisaiswireshark
; cependant, ce fait important n'était pas clair pour moi jusqu'à ce que je renifle. J'examinerai comment je peux changer Backspace pour l'utiliserControl_h
dansrxvt
... ou peut-être que je dois penser à trouver un autre terme.stty
doit s'exécuter côté application. Je doute fortement detelnet
traduire des caractères saisis ou que vous devez utiliserscript
; simplement exécuterstty
sur la machine distante fera probablement l'affaire.stty
.Enter
envoyez. 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 .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.
la source
telnet
ne prête aucune attention aux mappages de terminaux locaux du clavier. Notes d'Anne Barreta sur le clavier et le telnetLes programmes sont censés interroger les paramètres du terminal pour savoir quel est le caractère de retour arrière (
^h
et^?
, par exemple\010
-à- et\177
, sont les deux choix disponibles). Utilisezstty erase '^h'
oustty 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 .stty
ne 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écuterstty
dans 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
netcat
rapport à vstelnet
est 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^h
ou\e[?67l
à BackSpaceenvoyer^?
. La ressource correspondante estXTerm.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
^h
ou^?
lorsque vous appuyez sur BackSpace, et l'autre caractère lorsque vous appuyez sur Ctrl+ BackSpace. Cela peut être utile à la rigueur.Notez que
showkeys
et les amis ne sont pertinents que sur la console Linux, pas dans X.la source