J'utilise Java sur Windows XP et je souhaite pouvoir envoyer des commandes à un autre programme tel que Telnet.
Je ne veux pas simplement exécuter un autre programme. Je veux l'exécuter, puis envoyez-la 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 cela ne fonctionne pas:
(Si vous déconnectez et modifiez la commande en «cmd», cela fonctionne comme prévu. S'il vous plaît aider.)
Ceci est un exemple simplifié. En production, il y aura beaucoup plus de commandes envoyées, donc
4 Réponses :
Ce n'est pas directement une réponse à votre question, mais ... p>
au lieu d'utiliser runtime.exeec () code> Vous devez utiliser un
ProcessBuilder code>
et redirect starr code> à
stdout code> (
processbuilder.reditRrorStream (vrai) code> < / a>). Sinon, votre processus pourrait bloquer s'il écrit quelque chose à
starr code> (Windows n'aime pas le moment où la sortie d'un processus n'est pas lue). P>
Ceci est assez proche d'une "réponse directe" - vous pouvez démarrer le processus et lire la sortie à partir de Process.GetOutoutPutStream () code> et écrire des commandes sur
processus.getInputStream () code>
J'ai essayé cela et j'ai le même problème. La sortie de Telnet n'est pas lue. Programme exécute sans rien imprimer.
Une petite correction à ce que D.Shawley a écrit, du point de vue de votre code en Java, vous avez réellement Lire de B> processus.getInputStream () code> et écrire à B>
processus.getoutoutPutStream () code> ... La nommée est confuse, elles ont été apparemment nommées d'un point de vue différent ...
Cela semble correct, car il ne produira pas que beaucoup de sortie, mais vous devriez vraiment lire et écrire dans des threads séparés afin qu'il ne remplisse pas le tampon et le bloc vous attendez à lire avant d'atteindre la prochaine étape. p>
Donc, si vous atteignez le point où vous affleurez la commande que vous l'envoyez, déterminez si le client Windows Telnet prend en charge la réception des commandes de l'entrée standard plutôt que d'une console en utilisant le texte que vous envoyez à son entrée standard à son entrée. dans une invite de commande. P>
Par exemple, Echo Dir C: \ | CMD CODE> Les causes CMD s'exécutent, répertoriez le contenu C: lecteur et quittez le même comportement que si vous avez saisi
dir c: code> dans la console. Mais
Echo Open Localhost | Telnet code> Cause Telnet pour effacer l'écran puis quitter, plutôt que de se comporter de la même manière que si vous le saisissez dans la console. Comme Telnet doit masquer l'entrée de l'utilisateur pour des mots de passe, il est fort probable qu'il utilise le API de console plutôt que de lire à partir d'une entrée standard. C'est Aide A> Ne listez pas d'arguments de commande pour le dire de lire à partir d'une entrée standard, vous devez donc utiliser une implémentation Telnet qui est mieux adaptée à la script. P>
Je suis d'accord. Ceci est un exemple simplifié pour montrer mon problème, donc je l'ai gardé seul fileté. Pouvez-vous s'il vous plaît expliquer ce que vous entendez par entrée standard contre console et passepoiser le texte?
@Bradvido Eh bien, Echo Open Localhost | Telnet code> ne fonctionne pas mais
Echo Dir C: | cmd code> fait, donc je soupçonne fortement que Windows Telnet Client utilise l'API de la console pour détecter les touches plutôt que de lire son flux d'entrée.
Je vois ça maintenant. C'est évidemment le problème que je rencontre. Avez-vous une idée de la manière dont je peux écrire à la console d'une application au lieu du flux d'entrée?
Si vous souhaitez contrôler une session Telnet de Java, vous pourrez peut-être utiliser ce Java Telnet Library ... Vous pouvez faire les mêmes choses (open Connections, envoyer le nom d'utilisateur / mot de passe, envoyer des commandes et recevoir des résultats) mais sans reproduire un processus distinct. P>
Le Telent était simplement pour un exemple. J'ai besoin que cela soit générique afin que je puisse exécuter n'importe quelle commande exécutable et écrire des commandes.
Vous pouvez jeter un coup d'œil sur le TELNETT TASK Vous pouvez appeler Il est directement dans votre code sans avoir à utiliser un fichier Vous pouvez également jeter un coup d'œil sur le code source et voyez comment ils le font. p> build.xml code>. p>
Vous voulez donc une solution de communication inter Process pour Java?
Il me semble que telnet écrit sa sortie à autre chose que le flux d'entrée du processus et Java ne le captimiste pas. Est le processus.getInputStream () la seule méthode de lecture de ce qu'est un processus?