我正在为运行RedHat的服务器设计控制台应用程序。最终用户应该能够使用他们选择的任何终端运行此应用程序。 (例如,Gnome终端,Putty SSH / Telnet,MS Telnet客户端等)。
在大多数终端应用程序中都没有错,但是当我从MS telnet会话启动我的程序时,我注意到System.in
和System.console()
的特殊输入完全搞砸了。退格会将^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
的终端,这里会出现问题吗?我注意到Microsoft Telnet客户端不允许您在开始会话之前将TERM
类型设置为xterm
。但是,一旦会话开始,设置TERM=xterm
似乎可以解决问题。
大多数控制台应用程序如何解决此问题?
答案 0 :(得分:1)
对于字符终端应用程序,通信中总有两个端点,必须就如何解释控制字符达成一致。通常双方都能够使用termcap
/ terminfo
数据库中描述的各种编码。
在Unix服务器端,您可以通过设置TERM
环境变量或使用stty
来定义编码(否则使用默认值,通常是哑终端仿真) 。
在客户端,您还必须设置与服务器端相同的终端仿真。 Windows本机telnet也可以定义仿真(参见例如Configure the Telnet Terminal Type),也可以定义其他终端仿真器(例如Putty)。
关于您的设计决策:上述终端设置通常仅在用户文档中描述,而不是在应用程序中进行硬编码,以提供更大的灵活性。毕竟,您事先并不知道您的用户将使用哪个终端(只有一个简单的硬件终端,可能支持单个术语编码?)。
(由于你的问题与Java或system.in没什么关系,所以你可以重新考虑你使用的标签。)
答案 1 :(得分:-4)
你应该查看这两篇文章,因为它们与你正在做的事情有关。
当您在Unix服务器上运行控制台时,在您的情况下使用redhat,我还建议您查看Unix命令expect,它允许您读取控制台应用程序中的输入,并执行操作根据用户的输入。
以下是命令用法的一些示例。