为System.in设置环境
我正在为运行RedHat的服务器devise一个控制台应用程序。 最终用户应该能够运行这个应用程序与他们select的任何terminal。 (例如:Gnometerminal,Putty SSH / Telnet,MS Telnet客户端等)。
在大多数terminal应用程序中没有任何错误,但是当我从MS Telnet会话启动我的程序时,我注意到System.in
和System.console()
特殊input已经完全搞砸了。 退格键会将^H
写入屏幕,其他键写入乱码。
我已经深入了解这一点,我可以让它始终如一地工作,但是我确信我正在做的事情是严重的:
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); }
对于不支持xterm
terminal来说,会不会有一个问题? 我注意到,Microsoft Telnet客户端不允许您在开始会话之前将TERM
types设置为xterm
。 一旦会话开始,然而,设置TERM=xterm
似乎解决了这个问题。
大多数控制台应用程序如何解决这个问题?
在字符terminal应用中,通信中总是有两个端点,必须就如何解释控制字符达成一致。 通常双方都可以使用termcap
/ terminfo
数据库中描述的各种编码。
在Unix服务器端,你可以通过设置TERM
环境variables来定义编码,或者使用stty
(否则使用默认值,通常是哑terminal模拟)来定义编码。
在客户端,您还必须设置与服务器端相同的terminal仿真。 Windows本地telnet也可以像其他terminal仿真程序(例如Putty)一样定义仿真(请参阅configurationTelnetterminaltypes )。
关于您的devise决定 :上述terminal设置通常只在用户文档中描述,而不是在应用程序中进行硬编码,从而留下更多的灵活性。 毕竟,您并不知道您的用户将使用哪个terminal(只有一个简单的硬件terminal,支持单个termcap编码,或许?)。
( 因为你的问题与Java或system.in无关,所以你可以重新考虑你使用的标签。 )
你应该看看这两个职位,因为他们与你在做什么有关。
检查envvariables
设置环境variables
当你在Unix服务器上运行控制台时,在你的情况下使用redhat,我还build议你查看一下Unix命令expect,它允许你读取控制台应用程序中的input,并根据用户的input。
以下是一些命令用法的例子。
样品预期用途