Estoy diseñando una aplicación de consola para un servidor que ejecuta RedHat. Los usuarios finales deberían poder ejecutar esta aplicación con cualquier terminal de su elección. (Por ejemplo, Gnome Terminal, Putty SSH/Telnet, MS Telnet Client y otros).
En la mayoría de las aplicaciones de terminal no hay nada malo, sin embargo, cuando ejecuto mi programa desde una sesión de telnet de MS, noto que mis entradas especiales para System.in y System.console() se desordenan por completo. Un retroceso escribirá ^H en la pantalla y otras teclas también escribirán galimatías.
Lo he pirateado lo suficiente como para que funcione de manera consistente, pero estoy seguro de que lo que estoy haciendo es asqueroso:
if (!System.getenv("TERM").equals("xterm")) { System.out.println("\nWARNING: The TERM type is now set to xterm\n"); final String[] cmd = { "/bin/sh", "-c", "export TERM=xterm" }; Runtime.getRuntime().exec(cmd); } ¿Habría algún problema aquí para terminales que no son compatibles con xterm ? Observé que el cliente Microsoft Telnet no le permite establecer el tipo TERM en xterm antes de comenzar una sesión. Sin embargo, una vez que se inicia la sesión, establecer TERM=xterm parece resolver el problema.
¿Cómo resuelven este problema la mayoría de las aplicaciones de consola?
Con las aplicaciones de terminal de caracteres, siempre hay dos extremos en la comunicación, que deben ponerse de acuerdo sobre cómo interpretar los caracteres de control. Por lo general, ambos lados son capaces de usar una variedad de codificaciones descritas en la base de datos termcap / terminfo .
En el lado del servidor Unix , puede definir la codificación configurando la variable ambiental TERM o usando stty (de lo contrario, se usa un valor predeterminado, a menudo una emulación de terminal tonta).
En el lado del cliente también debe configurar la misma emulación de terminal que en el lado del servidor. Telnet nativo de Windows tiene la capacidad de definir la emulación (consulte, por ejemplo, Configurar el tipo de terminal de Telnet ), al igual que otros emuladores de terminal (por ejemplo, Putty).
Con respecto a sus decisiones de diseño : la configuración del terminal anterior generalmente solo se describe en la documentación del usuario y no está codificada en la aplicación, para dejar más flexibilidad. Después de todo, no sabe de antemano qué terminal (¿solo un terminal de hardware simple, que admita una sola codificación termcap, tal vez?) sus usuarios van a utilizar.
( Como su pregunta tiene poco que ver con Java o system.in, podría reconsiderar las etiquetas que usa).
Deberías mirar estas dos publicaciones, ya que están relacionadas con lo que estás haciendo.
comprobar la variable de entorno
establecer variable de entorno
Como está ejecutando la consola en la parte superior del servidor Unix, redhat en su caso, también le recomendaría que consulte el comando Unix expect, que le permite leer la entrada en la aplicación de la consola y realiza la acción de acuerdo con el entrada del usuario.
Estos son algunos ejemplos del uso del comando.