2010-09-21 11 views
8

Ich arbeite für eine große Organisation, die viele verschiedene Standorte in einem landesweiten Netzwerk unterstützt. Unser Lieferant liefert Diagnosetools für die Hardware, die wir an jedem Standort verwenden. Auf die Diagnose und Berichte wird über Telnet zugegriffen.Senden von Telnet-Befehlen und Lesen der Antwort mit Java

Das Problem ist, wir wollen alle Websites gleichzeitig überwachen und derzeit können wir sie nur einzeln überprüfen (über Telnet).

Ich habe bereits etwas gebaut, das Runtime.exec(String) verwenden wird, um Ping-Befehle an jede IP-Adresse zu senden. Aber jetzt möchte ich in der Lage sein, bestimmte Befehle automatisch mit den Diagnose- und Berichtstools des Herstellers zu senden. Irgendwelche Ideen über den besten Weg, dies zu tun? HINWEIS: Wir haben ein hybrides System - einige der Sites sind hinter einer Firewall, andere nicht. Eine vollständige Lösung wäre ideal, aber ich werde mich auch für eine Teillösung entscheiden.

Könnte es so einfach sein wie die Eingabe- und Ausgabeströme des Process-Objekts, das von Runtime.exec(String) zurückgegeben wird, und meine Befehle an die Eingabe senden und die Antwort auf der Ausgabe lesen? Oder sollte ich eine Verbindung zu Port 23 (dem üblichen Telnet-Port) herstellen und mich dann wie jedes andere Client-Server-System verhalten? Oder etwas ganz anderes?

Ich bin weiterhin Dinge auszuprobieren, gerade an diesem Punkt Brainstorming ...

CODE: (sensible Informationen entfernt)

void exec(String ip) 
{ 
    Socket sock = null; 
    BufferedReader br = null; 
    PrintWriter pw = null; 

    try 
    { 
    sock = new Socket(ip, 23); 

    br = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
    pw = new PrintWriter(sock.getOutputStream()); 

    this.read(br); 
    System.out.println("Sending username"); 
    pw.println("username"); 
    this.read(br); // Always blocks here 
    System.out.println("Sending password"); 
    pw.println("password"); 
    this.read(br); 

    pw.close(); 
    br.close(); 
    sock.close(); 
    } 
    catch(IOException e) 
    { 
    e.printStackTrace(); 
    } 
} 

void read(BufferedReader br) throws IOException 
{ 
    char[] ca = new char[1024]; 
    int rc = br.read(ca); 
    String s = new String(ca).trim(); 

    Arrays.fill(ca, (char)0); 

    System.out.println("RC=" + rc + ":" + s); 

//String s = br.readLine(); 
//  
//while(s != null) 
//{ 
// if(s.equalsIgnoreCase("username:")) 
// break; 
//   
// s = br.readLine(); 
//   
// System.out.println(s); 
//} 

Antwort

19

Warum Sie nicht einfach das Socket-System?

Öffnen Sie einen Socket für den ausgewählten Server an Port 23 und senden Sie Ihre eigenen Befehle von hier.


Hier ist ein kurzes Beispiel:

public class EchoClient { 
    public static void main(String[] args) throws IOException { 

     Socket pingSocket = null; 
     PrintWriter out = null; 
     BufferedReader in = null; 

     try { 
      pingSocket = new Socket("servername", 23); 
      out = new PrintWriter(pingSocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(pingSocket.getInputStream())); 
     } catch (IOException e) { 
      return; 
     } 

     out.println("ping"); 
     System.out.println(in.readLine()); 
     out.close(); 
     in.close(); 
     pingSocket.close(); 
    } 
} 

Ressourcen:

+0

versucht, aber readline() sperrt. Ich lege die readLine() in eine Schleife, um alle empfangenen Zeilen zu lesen, aber sie blockiert fast sofort. Was ich sehe ist: – BigMac66

+0

Verdammt Return-Taste! Was ich sehe, ist der Name des Verkäufers \ n Leerzeile \ n Benutzername: \ n Und es friert an diesem Punkt ein. Ich weiß, dass readLine() blockiert, so dass ich vermute, dass es auf ein EOF wartet, aber nie einen bekommt, so dass ich nie meinen Benutzernamen usw. senden kann. Das ist genau die geringe Detailtiefe, die ich vermeiden möchte. Sicher könnte ich nach Benutzername suchen: und einfach nicht die nächste Zeile lesen, aber ich möchte vermeiden, meine eigene Telnet-App zu schreiben :) – BigMac66

+0

Auf die eine oder andere Weise müssen Sie warten, bis der Benutzername vor dem Senden des Benutzernamens gefragt wird, also im Grunde Sie müssen immer noch Ihre eigene "Telnet App" schreiben. Aber für Ihr aktuelles Problem sollten Sie zwei Threads verwenden, einen zum Lesen und einen zum Senden von Antworten zur richtigen Zeit. –

0

telnet ist fast bare tcp. Sie können wahrscheinlich eine Socket-Verbindung herstellen, Befehle schreiben, Antworten lesen.

well - Telnet hat einige Steuerbefehle, die mit Datenstrom gemischt werden können. Sie können wahrscheinlich programmieren, um sie zu ignorieren. oder verwenden Sie ein Java-Telnet-Client-Paket, um perfekt Protokoll-bewusst zu sein.

+0

Können Sie ein Telnet-Paket vorschlagen - einfach und klein, vorzugsweise. – BigMac66

0

Expect ist eine Skript (nicht-Java) Möglichkeit. Es ist ein älteres Tool, sehen Sie die Vor- und Nachteile bei Wikipedia.

1

Das Problem mit der Socket-Ebene ist, dass Sie plötzlich ein Protokoll-Experte sein müssen, wenn Sie nur ein paar Telnet-Befehle ausführen möchten.

Ich habe einen Treiber oben auf de.mud.jta geschrieben, aber es lässt Threads offen, und ich weiß nicht wo und wie man diese behebt. Es scheint mir, dass es da draußen etwas Besseres geben muss als die Programmierung auf Protokollebene oder dieses alte JTA-Zeug.

0

Versuchen Sie, netty Java Library zu überprüfen. sie haben einen guten Satz von Telnet, SSH und anderer sehr nützlicher Netzwerk-Bibliothek

https://netty.io

Verwandte Themen