为 System.in 设置环境

2022-09-01 09:07:24

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

在大多数终端应用程序中,没有错,但是当我从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);
}

对于不支持的终端,这里会不会有问题?我注意到 Microsoft Telnet 客户端不允许在开始会话之前将类型设置为。但是,会话启动后,设置似乎可以解决问题。xtermTERMxtermTERM=xterm

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


答案 1

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

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

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

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

由于您的问题与Java或 system.in 无关,因此您可以重新考虑您使用的标签。termcapterminfoTERMstty)


答案 2

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

检查 env 变量

设置环境变量

由于您在Unix服务器之上运行控制台,因此,如果您的情况是redhat,我还建议您查看Unix命令期望,该命令允许您读取控制台应用程序中的输入,并根据用户的输入执行操作。

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

示例 预期用法


推荐