17 votes

Recherche d'un émulateur Telnet Java

Je suis en train d'écrire un programme back-end qui se connecte à un serveur, exécute des commandes et enregistre tous les résultats de ces commandes. Quelque chose comme Expect.

J'aimerais utiliser une solution open source qui bénéficie d'un bon support et fonctionne avec le JDK 6.

J'ai trouvé trois options jusqu'à présent et j'aimerais avoir de l'aide pour décider laquelle (ou une meilleure suggestion) utiliser.

commons-net - Le support est très bon, mais j'ai du mal à faire fonctionner une simple commande "Connectez-vous et faites 'ls'". Je préférerais utiliser cette bibliothèque, si quelqu'un peut fournir un exemple simple (et non l'exemple fourni qui prend l'entrée de l'utilisateur), j'aimerais suivre cette voie.

Si je ne peux pas utiliser commons-net les deux options suivantes sont :

JExpect - Ce n'est pas si difficile à utiliser, il fait ce dont j'ai besoin mais est-il bien supporté ? Fonctionnera-t-il avec le JDK 6, je pense que oui.

Java Telnet Application (jta26) - C'était facile à utiliser mais je ne suis pas sûr de sa polyvalence. Je n'ai pas vu d'endroit pour définir une valeur de timeout dans le TelnetWrapper. Je ne suis pas non plus certain que ce code soit maintenu puisque la dernière mise à jour du site date de 2005. ( http://www.javassh.org )

Je sais que tout ceci est quelque peu orienté vers l'opinion et j'espère que SO est un bon endroit pour m'aider à prendre une décision afin que je ne m'engage pas dans une voie pour découvrir plus tard que ce n'est pas ce que je recherche.

Merci.

17voto

Ben Points 934

J'ai trouvé ce que je cherchais ici : http://twit88.com/blog/2007/12/22/java-writing-an-automated-telnet-client/

Vous devrez modifier la variable prompt.

Copie du code :

import org.apache.commons.net.telnet.TelnetClient;

import java.io.InputStream;
import java.io.PrintStream;

public class AutomatedTelnetClient {
    private TelnetClient telnet = new TelnetClient();
    private InputStream in;
    private PrintStream out;
    private String prompt = "%";

    public AutomatedTelnetClient(String server, String user, String password) {
        try {
            // Connect to the specified server
            telnet.connect(server, 23);

            // Get input and output stream references
            in = telnet.getInputStream();
            out = new PrintStream(telnet.getOutputStream());

            // Log the user on
            readUntil("login: ");
            write(user);
            readUntil("Password: ");
            write(password);

            // Advance to a prompt
            readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void su(String password) {
        try {
            write("su");
            readUntil("Password: ");
            write(password);
            prompt = "#";
            readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String readUntil(String pattern) {
        try {
            char lastChar = pattern.charAt(pattern.length() - 1);
            StringBuffer sb = new StringBuffer();
            boolean found = false;
            char ch = (char) in.read();
            while (true) {
                System.out.print(ch);
                sb.append(ch);
                if (ch == lastChar) {
                    if (sb.toString().endsWith(pattern)) {
                        return sb.toString();
                    }
                }
                ch = (char) in.read();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void write(String value) {
        try {
            out.println(value);
            out.flush();
            System.out.println(value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public String sendCommand(String command) {
        try {
            write(command);
            return readUntil(prompt + " ");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void disconnect() {
        try {
            telnet.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        try {
            AutomatedTelnetClient telnet = new AutomatedTelnetClient(
                    "myserver", "userId", "Password");
            System.out.println("Got Connection...");
            telnet.sendCommand("ps -ef ");
            System.out.println("run command");
            telnet.sendCommand("ls ");
            System.out.println("run command 2");
            telnet.disconnect();
            System.out.println("DONE");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

0voto

Chochos Points 3364

Avez-vous regardé la bibliothèque d'outils Sadun ? Je l'ai utilisé une fois pour ouvrir une session telnet vers un serveur et envoyer quelques commandes, lire une réponse, et fermer la connexion, cela a bien fonctionné et c'est LGPL.

0voto

rtenhove Points 138

0voto

Naveen Points 1

AutomatedTelnetClient fonctionne bien. Après une longue recherche, il est agréable de voir un programme simple qui fonctionne :).

Je viens de modifier l'invite en $ et supprimé les espaces vides à la fin et toutes les commandes fonctionnent.

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