Forzar telnet / ssh para usar crtl-H para retroceso

9

Tengo algunos dispositivos conectados a un servidor de término en serie de Cisco; muchos funcionan bien cuando yo telnetdirectamente 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 rxvtdebajo de Debian Squeeze (en una X Window). TERMse establece en rxvt, pero no importa si yo uso vt100, vt101o xterm... el cambio TERMno tiene ningún efecto. Comencé el camino del cambio TERMsegún lo que vi en un viejo Kermit FAQ . FWIW, stty erase ^hy 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 -alas teclas en cuestión ... ^?corresponde a Backspacey ^Hes 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 loadkeysningú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]$
Mike Pennington
fuente
1
¿Lo has intentado ssty erase '^?'? Si los dispositivos insisten en un C-h, no es una llamada de Telnet, es el terminal (emulador).
Gilles 'SO- deja de ser malvado'
@Gilles su comentario en realidad no es correcto, vea mi respuesta a continuación
Mike Pennington,

Respuestas:

10

Finalmente encontré una respuesta en Linux Keyboard Hall of Shame de Anne Baretta ... parece que cambiar las asignaciones de teclas en xterm/ rxvtno sirve para nadatelnet .

Validé esto cuando olfateé la conexión telnet. Primero olfateé la sesión de telnet y vi que se Backspaceenviaba 0x7fal host. A continuación he roto intencionadamente Backspaceen rxvtel uso stty erase $(mapear así mi retroceso para el signo del dólar rxvt). Después de hacer esto, tuve que presionar $para retroceder rxvt, pero telnetaún así lo envié 0x7fcuando lo usé Backspaceen el host remoto.

SOLUCIÓN

Cree un script llamado kbdfix(a continuación) y hágalo ejecutable con 755permisos; necesitará los paquetes tclshy expectcargados desde sus archivos de distribución.

#!/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"}
}

Ahora para conectarme a los hosts rotos, escribo kbdfix telnet 192.168.12.117 2006y 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 es kbdfix ssh 172.16.1.26.

Mike Pennington
fuente
2
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.
jlliagre
@jlliagre, sí, descubrí cómo sttyno cambiaba telnetla lectura del teclado cuando lo usaba wireshark; Sin embargo, este hecho importante no me quedó claro hasta que olfateé. Voy a investigar la forma en que puedo cambiar de retroceso para utilizar Control_hen rxvt... o tal vez tenga que pensar en encontrar otro término.
Mike Pennington
@ Mike: Creo que todavía estás confundido acerca de algo (lo cual admito que ni jlliagre ni yo mencioné explícitamente; he actualizado mi respuesta). sttynecesita ejecutarse en el lado de la aplicación. Dudo mucho que telnetesté traduciendo caracteres de entrada o que necesite usar script; solo ejecutar sttyen la máquina remota probablemente hará el truco.
Gilles 'SO- deja de ser malvado'
@Gilles, la máquina remota es un dispositivo de red, no tiene stty.
Mike Pennington
1
@ Mike: cuando usa netcat, su terminal está en modo cocinado: escribe una línea, la edita localmente y la Enterenví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 .
Gilles 'SO- deja de ser malvado'
3

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.

jlliagre
fuente
Su pregunta se basa en la suposición de que telnet está haciendo un procesamiento específico de la tecla de retroceso que creo que está mal. Debería haberlo puesto como un comentario en lugar de una respuesta.
jlliagre
AFAICT, telnetno presta atención a las asignaciones de terminales locales del teclado. Notas de Anne Barreta sobre el teclado y el telnet
Mike Pennington
Me temo que no entiendes lo que hace stty.
jlliagre
3

Se supone que los programas deben consultar la configuración del terminal para averiguar cuál es el carácter de retroceso ( ^hy ^?, es decir , \010y \177, son las dos opciones disponibles). Use stty erase '^h'o stty 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 . sttyno 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 ejecutarlo sttyen 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 netcatvs. telnetse 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 ^ho \e[?67lpara BackSpaceenviar ^?. El recurso correspondiente es XTerm.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 ^ho ^?cuando presiona BackSpace, y el otro carácter cuando presiona Ctrl+ BackSpace. Esto puede ser útil en caso de apuro.

Tenga en cuenta que showkeysy los amigos solo son relevantes en la consola de Linux, no dentro de X.

Gilles 'SO- deja de ser malvado'
fuente