为 System.in 设置环境

Posted

技术标签:

【中文标题】为 System.in 设置环境【英文标题】:Setting The Environment for System.in 【发布时间】:2016-05-19 14:42:39 【问题描述】:

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

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

【问题讨论】:

可能你的胡言乱语是 ansi 转义序列***.com/questions/16755142/… 看那里:github.com/fusesource/jansi Jansi 是一个小型 Java 库,它允许您使用 ANSI 转义序列来格式化控制台输出,即使在 Windows 上也可以。 @AndreasFrische 哇,看起来很有希望!将不得不玩它! @AndreasFrische 啊,遗憾的是我认为这行不通。看起来它只用于输出,而我的问题是输入期间显示的文本。 sourceforge.net/p/telnetd/code/HEAD/tree/osgi/trunk/src/java/… 【参考方案1】:

对于字符终端应用程序,通信总是有两端,它们必须就如何解释控制字符达成一致。通常双方都能够使用termcap/terminfo 数据库中描述的各种编码。 在 Unix 服务器端您可以通过设置 TERM 环境变量或使用 stty 来定义编码(否则使用默认值,通常是哑终端仿真)。 在客户端您还必须设置与服务器端相同的终端仿真。 Windows 原生 telnet 能够定义仿真(参见例如 Configure the Telnet Terminal Type),其他终端仿真器(例如 Putty)也是如此。关于您的设计决策:以上终端设置通常只在用户文档中描述,而不是在应用程序中硬编码,以留出更大的灵活性。毕竟,您事先并不知道您的用户将使用哪个终端(可能只是一个简单的硬件终端,支持单个 termcap 编码?)。 (由于您的问题与 Java 或 system.in 关系不大,因此您可以重新考虑您使用的标签。

【讨论】:

【参考方案2】:

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

check env variable

set environment variable

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

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

sample Expect usages

【讨论】:

以上是关于为 System.in 设置环境的主要内容,如果未能解决你的问题,请参考以下文章

Java之基本类库学习

java 标准输入输出System.in与System.out

在Postman中如何设置环境变量?

options:R语言环境变量设置

为 Nodejs 项目设置 Azure 函数环境变量

为 PayPal Api 设置环境