繁体   English   中英

为System.in设置环境

[英]Setting The Environment for System.in

我正在为运行RedHat的服务器设计一个控制台应用程序。 最终用户应该能够使用他们选择的任何终端运行此应用程序。 (例如; Gnome终端,Putty SSH / Telnet,MS Telnet客户端等)。

在大多数终端应用程序中没有任何错误,但是当我从MS telnet会话启动我的程序时,我注意到我对System.inSystem.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似乎可以解决问题。

大多数控制台应用程序如何解决此问题?

对于字符终端应用程序,通信中总有两个端点,必须就如何解释控制字符达成一致。 通常双方都能够使用termcap / terminfo数据库中描述的各种编码。

在Unix服务器端,您可以通过设置TERM环境变量或使用stty来定义编码(否则使用默认值,通常是哑终端仿真)。

在客户端,您还必须设置与服务器端相同的终端仿真。 Windows本机telnet具有定义仿真的能力(参见例如配置Telnet终端类型 ),以及其他终端仿真器(例如Putty)。

关于您的设计决策 :上述终端设置通常仅在用户文档中描述,而不是在应用程序中进行硬编码,以提供更大的灵活性。 毕竟,您不知道您的用户将使用哪个终端(只有一个简单的硬件终端,可能支持单个termcap编码?)。

由于您的问题与Java或system.in几乎没有关系,因此您可以重新考虑您使用的标记。

您应该查看这两篇帖子,因为它们与您正在做的事情有关。

检查env变量

设置环境变量

当您在Unix服务器上运行控制台时,在您的情况下使用redhat,我还建议您查看Unix命令expect,它允许您读取控制台应用程序中的输入,并根据用户的输入。

以下是命令用法的一些示例。

样本期待用法

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM