In Java, das senden von Befehlen an ein anderes Kommandozeilen-Programm
Bin ich mit Java auf Windows XP und wollen in der Lage sein, um Befehle zu senden, um ein anderes Programm wie telnet.
Ich möchte nicht einfach ein anderes Programm ausgeführt. Ich ausführen möchten, und dann senden Sie eine Folge von Befehlen, die, wenn es einmal läuft.
Hier ist mein code, was ich tun will, aber es funktioniert nicht:
(Wenn Sie das Kommentarzeichen, und ändern Sie den Befehl "cmd" funktioniert es wie erwartet. Bitte helfen Sie.)
Dies ist ein Vereinfachtes Beispiel. In der Produktion wird es viele weitere Befehle gesendet, so bitte nicht schlagen Aufruf von "telnet localhost".
try
{
Runtime rt = Runtime.getRuntime();
String command = "telnet";
//command = "cmd";
Process pr = rt.exec(command);
BufferedReader processOutput = new BufferedReader(new InputStreamReader(pr.getInputStream()));
BufferedWriter processInput = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream()));
String commandToSend = "open localhost\n";
//commandToSend = "dir\n" + "exit\n";
processInput.write(commandToSend);
processInput.flush();
int lineCounter = 0;
while(true)
{
String line = processOutput.readLine();
if(line == null) break;
System.out.println(++lineCounter + ": " + line);
}
processInput.close();
processOutput.close();
pr.waitFor();
}
catch(Exception x)
{
x.printStackTrace();
}
- Sie wollen also eine inter-Prozess-Kommunikation-Lösung für java?
- Es scheint mir, wie telnet schreibt seine Ausgabe auf etwas anderes als den Prozess-input-stream, und java ist nicht die Erfassung. Ist der Prozess.getInputStream() die einzige Methode, um zu Lesen, was ein Prozess ist die Ausgabe?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das OK ist, da es nicht mehr produziert, dass viel Leistung, aber Sie sollten wirklich Lesen und schreiben in separaten threads, so dass es nicht füllen, bis der Puffer-und block-warten Sie zu Lesen, bevor Sie den nächsten Schritt gelangen.
Also, wenn es ist der Punkt erreicht, wo Sie bündig den Befehl, den Sie senden, um es, herauszufinden, ob die Windows-telnet-client unterstützt das empfangen von Kommandos von der Standardeingabe anstatt eine Konsole, die durch Rohrleitungen den text, den Sie senden, um seine standard-Eingabe auf die es in einer Eingabeaufforderung.
Beispielsweise
echo dir c:\ | cmd
Ursachen cmd ausführen, Liste das Laufwerk c: Inhalt und Ausfahrt viel das gleiche Verhalten, als ob Sie eingegeben habendir c:\
in die Konsole ein. Aberecho open localhost | telnet
Ursachen telnet um den Bildschirm zu löschen und dann die Ausfahrt, anstatt gleich Verhalten, als ob Sie tippte es in die Konsole ein. Als telnet muss die Maske Benutzer-Eingabe für Passwörter, ist es ziemlich wahrscheinlich, dass es mit der Konsolen-API eher als das Lesen von der Standardeingabe. Es ist helfen Liste nicht alle Argumente zu sagen, es zu Lesen von der Standardeingabe, also vielleicht müssen Sie eine telnet-Implementierung ist besser geeignet, um scripting.echo open localhost | telnet
funktioniert nicht, aberecho dir c: | cmd
hat, so vermute ich stark, dass die Windows-telnet-client ist mit Hilfe der Konsole-API zum erkennen von Tastendrücken eher als das Lesen der input-stream.Es ist nicht direkt eine Antwort auf deine Frage, aber...
Anstatt
Runtime.exec()
sollten Sie eineProcessBuilder
und leitenstderr
zustdout
(ProcessBuilder.redirectErrorStream(true)
). Ansonsten wird Ihr Prozess blockieren könnte, wenn er etwas schreibt, was zustderr
(Windows mag es nicht, wenn der output eines Prozesses ist nicht zu Lesen).Process.getOutputStream()
- und schreib-Befehle, umProcess.getInputStream()
Process.getInputStream()
und schreibenProcess.getOutputStream()
... die Namensgebung ist verwirrend, Sie wurden anscheinend namens aus einer anderen Sicht...Wenn Sie wollen, um die Kontrolle über eine telnet-Sitzung programmatisch aus Java, Sie können möglicherweise verwenden Sie diese Java-telnet-Bibliothek... man kann die gleichen Dinge tun (offene verbindungen, senden Sie Benutzername/Passwort, Kommandos zu senden und zu empfangen, Ergebnisse), aber ohne tatsächlich erzeugt einen eigenen Prozess.
Können Sie einen Blick auf die Telnet-Ant-Aufgabe Sie können es nennen, direkt im code ohne die Verwendung einer
build.xml
- Datei.Können Sie auch einen Blick auf die source code und sehen, wie Sie es tun.