Tengo algunos dispositivos conectados a un servidor de término en serie de Cisco; muchos funcionan bien cuando yo telnet
directamente al puerto en Cisco. Sin embargo, tengo algunos dispositivos obstinados que no se usarán, Backspaceya que está asignado en telnet de forma predeterminada.
En caso de que sea importante, hago telnet desde rxvt
debajo de Debian Squeeze (en una X Window). TERM
se establece en rxvt
, pero no importa si yo uso vt100
, vt101
o xterm
... el cambio TERM
no tiene ningún efecto. Comencé el camino del cambio TERM
según lo que vi en un viejo Kermit FAQ . FWIW, stty erase ^h
y stty erase ^?
tampoco funcionan.
He notado que Backspacefunciona correctamente en estos dispositivos si uso un socket TCP sin procesar de netcat
... es decir nc 192.168.12.117 2006
; sin embargo, luego me encuentro con otros problemas con contraseñas no ocultas o paginación de terminal.
¿Cómo puedo forzar selectivamente telnet y ssh para asignar Backspacea CtrlHestos dispositivos? Además, ¿qué criterios debo usar para evaluar si se trata de un error en el dispositivo?
EDITAR
En caso de que sea importante, esta es la salida de showkey -a
las teclas en cuestión ... ^?
corresponde a Backspacey ^H
es CtrlH. Parece que debería estar acercándome cuando miro El Teclado y la Consola de Linux , pero parece que no puedo descifrar lo que puedo hacer para cambiar esto. He intentado varios encantamientos sin loadkeys
ningún efecto.
[mpenning@hotcoffee docs]$ sudo showkey -a
Press any keys - Ctrl-D will terminate this program
^? 127 0177 0x7f
^H 8 0010 0x08
También incluyo resultados relevantes de dumpkeys
... esta es la asignación actual en mi sistema (que no funciona en algunos dispositivos en cuestión). Si pudiera descubrir cómo Backspacehacer lo mismo CtrlH, tendría una solución.
[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 los dispositivos insisten en unC-h
, no es una llamada de Telnet, es el terminal (emulador).Respuestas:
Finalmente encontré una respuesta en Linux Keyboard Hall of Shame de Anne Baretta ... parece que cambiar las asignaciones de teclas en
xterm
/rxvt
no sirve para nadatelnet
.Validé esto cuando olfateé la conexión telnet. Primero olfateé la sesión de telnet y vi que se Backspaceenviaba
0x7f
al host. A continuación he roto intencionadamente Backspaceenrxvt
el usostty erase $
(mapear así mi retroceso para el signo del dólarrxvt
). Después de hacer esto, tuve que presionar $para retrocederrxvt
, perotelnet
aún así lo envié0x7f
cuando lo usé Backspaceen el host remoto.SOLUCIÓN
Cree un script llamado
kbdfix
(a continuación) y hágalo ejecutable con755
permisos; necesitará los paquetestclsh
yexpect
cargados desde sus archivos de distribución.Ahora para conectarme a los hosts rotos, escribo
kbdfix telnet 192.168.12.117 2006
y Backspacefunciona.Nota para cualquier persona confundida en 2006 arriba ... ese es el puerto TCP que el término servidor de Cisco usa para la conexión en serie a la consola del dispositivo roto (en este caso, un conmutador Brocade FCX).
Si simplemente está haciendo telnet a un dispositivo que no le gusta Backspace, lo usaría
kbdfix telnet <addr_of_the_broken_device>
. También estoy usando esto con ssh cuando ssh a un conmutador Ethernet DLink DGS-3200 que tiene problemas similares; la sintaxis eskbdfix ssh 172.16.1.26
.fuente
stty erase $
no asigna la tecla "retroceso" a "$", le dice al controlador tty que para borrar un carácter, debe usarse la tecla "$". Cuando ejecuta telnet, está en modo sin procesar, por lo que esta configuración se ignora. Una solución simple sería configurar su emulador de terminal para enviar ^ H para retroceso, como Dios pretendía, otro está usando su truco que traduce estos caracteres sobre la marcha usando esperar.stty
no cambiabatelnet
la lectura del teclado cuando lo usabawireshark
; Sin embargo, este hecho importante no me quedó claro hasta que olfateé. Voy a investigar la forma en que puedo cambiar de retroceso para utilizarControl_h
enrxvt
... o tal vez tenga que pensar en encontrar otro término.stty
necesita ejecutarse en el lado de la aplicación. Dudo mucho quetelnet
esté traduciendo caracteres de entrada o que necesite usarscript
; solo ejecutarstty
en la máquina remota probablemente hará el truco.stty
.Enter
envía. Cuando usa telnet, su terminal está en modo sin procesar: cada carácter se envía inmediatamente a la aplicación. Vea, por ejemplo, el comienzo de esta página , o este artículo de Wikipedia .Retroceso y Control-H fueron diseñados para ser lo mismo, pero hoy en día, especialmente en Linux, a menudo tiene retroceso enviando eliminar y eliminar enviando alguna secuencia de escape extraña.
En cualquier caso y hasta donde yo sé, telnet o la variable TERM no deberían cambiar lo que envía el retroceso, esta suele ser una característica de configuración del emulador de terminal.
fuente
telnet
no presta atención a las asignaciones de terminales locales del teclado. Notas de Anne Barreta sobre el teclado y el telnetSe supone que los programas deben consultar la configuración del terminal para averiguar cuál es el carácter de retroceso (
^h
y^?
, es decir ,\010
y\177
, son las dos opciones disponibles). Usestty erase '^h'
ostty erase '^?'
para declarar lo que envía su terminal.Si inicia sesión de forma remota (con telnet, rsh o ssh) dentro del terminal, tenga en cuenta que debe ejecutar
stty
en el lado de la aplicación .stty
no le dice al terminal que haga algo diferente, informa al controlador del terminal local (es decir, la parte que interactúa con las aplicaciones que se ejecutan en el terminal) sobre la configuración del terminal (históricamente un objeto físico, ahora un emulador de terminal). De manera similar, si ejecuta Screen o un software similar terminal-in-terminal, debe ejecutarlostty
en cada ventana de pantalla (pero generalmente Screen puede configurarse para hacer lo correcto desde su archivo de configuración, si no funciona de inmediato) )La diferencia en el comportamiento que observa de
netcat
vs.telnet
se debe a la forma en que se usa el terminal: * En netcat, el terminal está en modo línea por línea (también llamado "modo cocinado"). Edita una línea (utilizando la función de edición incorporada del terminal local y, en particular, la configuración stty local), luego la envía en su estado final al host remoto. * En telnet, el terminal (local) está en modo carácter por carácter (también denominado "modo sin formato"). Cada pulsación de tecla va directamente a Telnet, que lo transmite inmediatamente al sistema remoto. Usted depende de las funciones de edición de línea del sistema remoto.Hay programas rotos que no se preocupan por la configuración del terminal. Parece que te has encontrado con uno de ellos. Su mejor opción es cambiar la configuración de su terminal. Lo mismo ocurre si necesita comunicarse con un dispositivo a través de un protocolo remoto como telnet o SSH y el dispositivo no es configurable.
Con xterm, es fácil: hay una configuración para alternar el carácter enviado por la BackSpacetecla en tiempo de ejecución. Desde el menú del botón izquierdo, alternar "Eliminar es DEL". Programáticamente, envíe la secuencia de escape
\e[?67h
para BackSpaceenviar^h
o\e[?67l
para BackSpaceenviar^?
. El recurso correspondiente esXTerm.backarrowKeyIsErase
. Otros emuladores de terminal pueden o no tener una función de interfaz similar o admitir la secuencia de escape.Muchos emuladores de terminal envían uno
^h
o^?
cuando presiona BackSpace, y el otro carácter cuando presiona Ctrl+ BackSpace. Esto puede ser útil en caso de apuro.Tenga en cuenta que
showkeys
y los amigos solo son relevantes en la consola de Linux, no dentro de X.fuente