Senden Sie in Java Befehle an ein anderes Befehlszeilenprogramm

8

Ich verwende Java unter Windows XP und möchte Befehle an ein anderes Programm wie Telnet senden können. Ich möchte nicht einfach ein anderes Programm ausführen. Ich möchte es ausführen und dann eine Sequenz von Befehlen senden, sobald es ausgeführt wird. Hier ist mein Code von dem, was ich tun möchte, aber es funktioniert nicht: (Wenn Sie den Befehl auskommentieren und den Befehl in "cmd" ändern, funktioniert das wie erwartet. Bitte helfen.) Dies ist ein vereinfachtes Beispiel. In der Produktion werden viele weitere Befehle gesendet, also bitte nicht den Aufruf von "telnet localhost" vorschlagen.

%Vor%     
bradvido 20.05.2010, 20:37
quelle

4 Antworten

3

Das sieht OK aus, da es nicht so viel Ausgabe produzieren wird, aber Sie sollten wirklich in separaten Threads lesen und schreiben, damit es den Puffer und Block nicht füllt, der darauf wartet, gelesen zu werden, bevor Sie den nächsten Schritt erreichen.

Wenn Sie also den Befehl erreichen, an den Sie den Befehl senden, ermitteln Sie, ob der Windows-Telnet-Client Befehle von der Standardeingabe statt von einer Konsole unterstützt, indem er den gesendeten Text an die Standardeingabe weiterleitet in einer Eingabeaufforderung.

Zum Beispiel führt echo dir c:\ | cmd dazu, dass cmd ausgeführt wird, listet den Inhalt des c: Laufwerks auf und beendet es, ähnlich wie bei der Eingabe von dir c:\ in die Konsole. Aber echo open localhost | telnet bewirkt, dass Telnet den Bildschirm löscht und dann beendet, anstatt sich so zu verhalten, als ob Sie es in die Konsole eingegeben hätten. Da Telnet Benutzereingaben für Passwörter maskieren muss, ist es sehr wahrscheinlich, dass es das verwendet Konsolen-API anstatt von der Standardeingabe zu lesen. Es ist help nicht aufgeführt alle Befehlsargumente, um es aus der Standardeingabe zu lesen, also müssen Sie vielleicht eine Telnet-Implementierung verwenden, die besser zum Skripten geeignet ist.

    
Pete Kirkham 20.05.2010, 20:48
quelle
3

Es ist nicht direkt eine Antwort auf Ihre Frage, aber ...

Anstatt Runtime.exec() zu verwenden, sollten Sie eine ProcessBuilder und redirect stderr auf stdout ( ProcessBuilder.redirectErrorStream(true) ). Andernfalls könnte Ihr Prozess blockieren, wenn er etwas in stderr schreibt (Windows mag es nicht, wenn die Ausgabe eines Prozesses nicht gelesen wird).

    
tangens 20.05.2010 20:46
quelle
2

Wenn Sie eine Telnet-Sitzung programmatisch über Java steuern möchten, können Sie diese Java-Telnet-Bibliothek ... können Sie die gleichen Dinge tun (Verbindungen öffnen, Benutzernamen / Passwort senden, Befehle senden und Ergebnisse erhalten), ohne jedoch einen separaten Prozess zu generieren.

    
psmears 20.05.2010 20:54
quelle
1

Sie können sich die Telnet-Ant-Aufgabe ansehen, die Sie direkt in Ihrem Code aufrufen können Out muss eine build.xml Datei verwenden.

Sie können auch die Quellcode und sehen, wie sie es tun.

    
OscarRyz 20.05.2010 20:59
quelle