33 votes

Configuration de l'environnement pour System.in

Je suis en train de concevoir une application console pour un serveur fonctionnant sous RedHat. Les utilisateurs finaux doivent être en mesure d'exécuter cette application avec le terminal de leur choix. (Par exemple : Gnome Terminal, Putty SSH/ Telnet, MS Telnet Client et autres).

Dans la plupart des applications de terminal, il n'y a pas de problème, mais lorsque je lance mon programme à partir d'une session MS telnet, je remarque que mes entrées spéciales pour System.in et System.console() s'embrouiller complètement. Un retour arrière permet d'écrire ^H à l'écran et d'autres touches écrivent aussi du charabia.

J'ai suffisamment bricolé pour que ça marche régulièrement, mais je suis sûr que ce que je fais est dégoûtant :

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);
}

Est-ce qu'il y aurait un problème pour les terminaux qui ne supportent pas xterm ? J'ai remarqué que le client Telnet de Microsoft ne permet pas de définir l'adresse de l'utilisateur. TERM type à xterm avant de commencer une session. Cependant, une fois la session commencée, le réglage TERM=xterm semble résoudre le problème.

Comment la plupart des applications de console abordent-elles cette question ?

1voto

Artur Opalinski Points 584

Avec les applications de terminal de caractères, il y a toujours deux extrémités dans la communication, qui doivent se mettre d'accord sur la façon d'interpréter les caractères de contrôle. En général, les deux parties sont capables d'utiliser une variété de codages décrits dans le document intitulé termcap / terminfo base de données.

Du côté du serveur Unix vous pouvez définir le codage en définissant le TERM ou en utilisant la variable environnementale stty (un défaut est utilisé sinon, souvent une émulation de terminal débile).

Du côté du client vous devez également définir la même émulation de terminal que du côté du serveur. Le telnet natif de Windows a la capacité de définir l'émulation (voir par ex. Configurer le type de terminal Telnet ), tout comme d'autres émulateurs de terminal (par exemple Putty).

En ce qui concerne vos décisions de conception : Le paramétrage du terminal ci-dessus n'est généralement décrit que dans la documentation utilisateur, et non codé en dur dans l'application, afin de laisser plus de flexibilité. Après tout, vous ne savez pas à l'avance quel terminal (un simple terminal matériel, supportant un seul codage termcap, peut-être ?) vos utilisateurs vont utiliser.

( Comme votre question n'a pas grand-chose à voir avec Java ou system.in, vous pourriez reconsidérer les balises que vous utilisez. )

-4voto

g5thomas Points 23

Vous devriez examiner ces deux postes, car ils sont liés à ce que vous faites.

vérifier la variable env.

définir une variable d'environnement

Comme vous exécutez la console sur le serveur Unix, redhat dans votre cas, je vous recommande également de vous pencher sur la commande Unix expect, qui vous permet de lire l'entrée dans l'application de la console, et exécute l'action en fonction de l'entrée de l'utilisateur.

Voici quelques exemples d'utilisation de la commande.

exemple d'usages attendus

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X