Senden telnet-Befehle und das Lesen der Antwort mit Java
Ich arbeite für eine große Organisation, die unterstützt viele verschiedene Websites auf einem landesweiten Netzwerk. Unser Hersteller liefert Diagnose-tools für die hardware, die wir verwenden, an jedem Standort. Die Diagnose und Berichte sind, auf die der Zugriff über Telnet.
Das problem ist, wir überwachen möchten alle Standorten gleichzeitig und aktuell können wir nur überprüfen Sie Sie ein zu einer Zeit (über telnet).
Habe ich bereits gebaut, etwas, das Runtime.exec(String)
zu senden Sie ping-Befehle, um jede IP-Adresse. Jetzt will ich aber in der Lage sein zu senden, die bestimmte Befehle automatisch mit dem Hersteller Diagnose-und reporting-tools. Irgendwelche Ideen auf dem besten Weg, dies zu tun? HINWEIS: wir haben ein hybrid-system - einige der Seiten sind hinter einer firewall einige sind nicht. Eine komplette Lösung wäre ideal, aber ich, der sich für einen teilweisen als auch.
Könnte es sein, so einfach wie immer der input-und output-streams des Process-Objekts zurückgegeben von der Runtime.exec(String)
und senden Sie mir Befehle, um die Eingabe und das Lesen der Antwort auf die Ausgabe? Oder sollte ich eine Verbindung zu port 23 (dem üblichen telnet-port) und dann Verhalten sich wie jeder andere client-server-system. Oder etwas anderes völlig anderes?
Bin ich weiterhin ausprobieren, nur brainstorming an dieser Stelle...
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);
//}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Warum nimmst du nicht einfach die Socket-system ?
Öffnen eines socket an den ausgewählten server auf port 23 und senden Sie Ihre eigenen Befehle von hier.
Hier ist ein kurzes Beispiel :
Ressourcen :
new PrintWriter(sock.getOutputStream(), true)
zu ermöglichen, autoflush, oder rufen Sieflush()
manuell nach jedemprintln()
Das problem mit dem tun Sie es nach unten zu der socket-Ebene ist, dass Sie plötzlich brauchen, um ein Protokoll Experte, wenn alles, was Sie tun möchten ist, ein paar telnet-Befehle.
Schrieb ich einen Treiber auf der Spitze de.Schlamm.jta, aber es lässt die threads öffnen, und ich weiß nicht, wo und wie Sie zu beheben diese. Scheint mir, dass es etwas besseres gibt, als mit der Programmierung auf der Protokoll-Ebene oder diese alte JTA Zeug.
telnet ist fast nackten tcp. Sie können wahrscheinlich machen eine socket-Verbindung, Befehle schreiben, Lesen, Antworten.
gut telnet funktioniert haben einige Steuerbefehle, kann gemischt werden mit Daten-stream. wahrscheinlich können Sie das Programm, um Sie zu ignorieren. oder, um vollkommen zu Protokoll bewusst, verwenden ein java-telnet-client-Paket.
Erwarten ist ein Skript (nicht-Java) die Möglichkeit. Es ist ein älteres tool, sehen Sie die vor-und Nachteile bei Wikipedia.
Versuchen, Die Kontrolle Netty Java-Bibliothek. Sie haben einen guten Satz von Telnet , SSH und anderen sehr nützlichen Netzwerk-Bibliothek
https://netty.io