En Java, envoyer des commandes à un autre programme de ligne de commande
Je suis à l'aide de Java sur Windows XP et que vous voulez être en mesure d'envoyer des commandes à un autre programme tel que telnet.
Je ne veux pas simplement exécuter un autre programme. Je veux l'exécuter, et puis de l'envoyer à une séquence de commandes une fois qu'il est en cours d'exécution.
Voici mon code de ce que je veux faire, mais il ne fonctionne pas:
(Si vous supprimez et modifiez la commande "cmd" il fonctionne comme prévu. S'il vous plaît aider.)
C'est un exemple simplifié. En production, il y aura beaucoup plus de commandes envoyées, veuillez vous suggère de ne pas appeler "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();
}
Donc, vous voulez une inter processus de solution de communication pour java?
Il me semble que telnet est l'écriture de sa sortie à quelque chose d'autre que le processus du flux d'entrée, et java n'est pas de la capture. C'est le Procédé.getInputStream() la seule méthode pour lire ce qu'un processus est sortie?
Il me semble que telnet est l'écriture de sa sortie à quelque chose d'autre que le processus du flux d'entrée, et java n'est pas de la capture. C'est le Procédé.getInputStream() la seule méthode pour lire ce qu'un processus est sortie?
OriginalL'auteur bradvido | 2010-05-20
Vous devez vous connecter pour publier un commentaire.
Qui semble OK, il ne sera pas produire beaucoup de sortie, mais vous devriez vraiment lire et écrire dans des threads séparés afin de ne pas remplir la mémoire tampon et la bloquer en attente de vous lire avant de vous passer à l'étape suivante.
Donc, si c'est d'atteindre le point où vous rincer la commande que vous envoyez à, savoir si le client telnet Windows prend en charge la réception des commandes à partir de l'entrée standard plutôt que d'une console de tuyauterie, le texte que vous envoyez à son entrée standard dans une invite de commande.
Par exemple,
echo dir c:\ | cmd
causes cmd pour exécuter, liste le lecteur c: contenu et à la sortie, beaucoup de le même comportement que si vous avez tapédir c:\
dans la console. Maisecho open localhost | telnet
causes telnet pour effacer l'écran, puis la sortie, plutôt que de se comporter de la même façon que si vous avez tapé dans la console. Comme telnet doit masque de saisie de l'utilisateur pour les mots de passe, il est très probable que c'est à l'aide de la console API plutôt que de lire sur l'entrée standard. C'est aider n'est pas la liste de toutes les commandes des arguments pour lui dire de lire l'entrée standard, de sorte que vous devrez peut-être utiliser un telnet de mise en œuvre de ce qui est mieux adapté à l'écriture de scripts.Eh bien,
echo open localhost | telnet
ne fonctionne pas, maisecho dir c: | cmd
fait, donc je soupçonne fortement que Windows telnet client est à l'aide de la console API pour détecter les touches plutôt que de lire ses flux d'entrée.Je le vois maintenant. C'est évidemment le problème, je suis en cours d'exécution dans. Avez-vous une idée de comment je peux écrire une application console plutôt que le flux d'entrée?
OriginalL'auteur Pete Kirkham
Ce n'est pas directement la réponse à votre question, mais...
Au lieu d'utiliser
Runtime.exec()
vous devez utiliser unProcessBuilder
et redirigerstderr
àstdout
(ProcessBuilder.redirectErrorStream(true)
). Sinon, votre processus pourrait bloquer si on écrit quelque chose destderr
(Windows n'aime pas quand la sortie d'un processus n'est pas lu).Process.getOutputStream()
et les commandes d'écriture pourProcess.getInputStream()
J'ai essayé, et j'ai le même problème. La sortie de telent n'est pas lu. Le programme s'exécute sans rien afficher.
Une petite correction à ce que D. Shawley écrit, du point de vue de votre code en Java, on fait de
Process.getInputStream()
et écrireProcess.getOutputStream()
... le nom est source de confusion, ils ont apparemment été nommé à partir d'un point de vue différent...OriginalL'auteur tangens
Si vous souhaitez contrôler une session telnet par programmation à partir de Java, vous pourriez être en mesure d'utiliser cette Java telnet bibliothèque... vous pouvez faire les mêmes choses (les connexions ouvertes, envoyer le nom d'utilisateur/mot de passe, envoyer des commandes et de recevoir des résultats) mais sans réellement la ponte d'un processus distinct.
OriginalL'auteur psmears
Vous pouvez prendre un coup d'oeil à la Telnet tâche Ant vous pouvez l'appeler directement dans votre code, sans avoir à utiliser un
build.xml
fichier.Vous pouvez aussi jeter un oeil à la le code source et de voir comment ils le font.
OriginalL'auteur OscarRyz