Подтвердить что ты не робот

Настройка среды для System.in

Я разрабатываю консольное приложение для сервера, на котором работает RedHat. Конечные пользователи должны иметь возможность запускать это приложение с любым терминалом по своему выбору. (Например, терминал Gnome, шлюз SSH/Telnet, клиент Telnet Telnet и другие).

В большинстве терминальных приложений нет ничего плохого, однако, когда я запускаю свою программу из сеанса telnet MS, я замечаю, что мои специальные входы для 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, похоже, решает проблему.

Как это происходит в большинстве консольных приложений?

4b9b3361

Ответ 1

В приложениях с символьными терминалами в сообщении всегда есть два конца, которые должны согласовать, как интерпретировать управляющие символы. Обычно обе стороны способны использовать множество кодировок, описанных в базе данных termcap/terminfo.

На стороне сервера Unix вы можете определить кодирование, установив переменную окружения TERM или используя stty (по умолчанию используется по умолчанию, часто эмуляция немого терминала).

На стороне клиента вам также необходимо настроить ту же эмуляцию терминала, что и на стороне сервера. Windows-родной telnet имеет возможность определять эмуляцию (см., Например, "Конфигурировать тип терминала Telnet" ), как и другие эмуляторы терминала (например, Putty).

Что касается ваших проектных решений: приведенные выше настройки терминала обычно описываются в документации пользователя, а не жестко закодированы в приложении, чтобы обеспечить большую гибкость. В конце концов, вы заранее не знаете, какой терминал (только простой аппаратный терминал, поддерживающий одну кодировку termcap, возможно?), Ваши пользователи будут использовать.

(Поскольку ваш вопрос имеет мало общего с Java или system.in, так что вы можете пересмотреть теги, которые вы используете.)

Ответ 2

Вы должны изучить эти два сообщения, поскольку они связаны с тем, что вы делаете.

проверить переменную env

установить переменную среды

Когда вы запускаете консоль поверх Unix-сервера, redhat в вашем случае, я также рекомендую вам заглянуть в команду Unix ожидать, что позволяет вам читать вход в консольном приложении и выполняет действие согласно входу пользователя.

Вот несколько примеров использования команды.

пример Ожидать использования