33

我正在为运行 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似乎可以解决问题。

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

4

2 回答 2

1

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

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

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

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

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

于 2016-05-11T06:29:27.493 回答
-4

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

检查环境变量

设置环境变量

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

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

示例 Expect 用法

于 2016-03-14T18:15:09.523 回答