Comment obtenir jsch shell de sortie de la commande en Chaîne
Je suis à l'aide d'un JSCH -SSH bibliothèque d'exécuter la commande "shell" de canal, mais incapable de trouver un moyen
faire 2 choses:-
1) Comment savoir si la commande est complètement exécuté sur unix distant boîte ?
2) Comment faire pour capturer la sortie de la commande dans la Chaîne , au lieu de l'impression sur le Système.sortie de la console ?
Ci-dessous est mon extrait de code qui fonctionne très bien à l'affichage de la ligne de commande à la sortie du système.hors
REMARQUE :je ne veux PAS utiliser ,"exec" de canal, car il commence un nouveau processus pour chaque commande et ne se souvient pas de "session", les variables qui ont été exportées. Je dois utiliser une "coquille" de canal.
Ci-dessous mon code extrait. Toute aide est appréciée.Merci pour votre temps.
try{
String commandToRun = "ls /tmp/*.log \n";
if(channel.isClosed())
channel=session.openChannel("shell");
byte[] bytes = commandToRun.getBytes();
ByteArrayInputStream bais=new ByteArrayInputStream(bytes);
channel.setInputStream(bais);
InputStream ins=channel.getInputStream();
channel.connect();
channel.setOutputStream(System.out);//This prints on console. Need 2 capture in String somehow?
//in-efficient way to allow command to execute completely on remote Unix machine
//DO NOT know a better way, to know when command is executed completely
Thread.sleep(5000L);
}
catch(Exception e){
System.out.println("Exception in executeCommand() --->"+ e.getMessage());
e.printStackTrace();
}
En général, vous ne devriez pas utiliser "shell" de canal pour automatiser l'exécution d'une commande. Utiliser "exec" de canal à la place. Voir Execute une liste de commandes à partir d'une liste de tableaux à l'aide de JSch exec en Java. Si vous utilisez la "coquille" de canal, vous obtenez des problèmes tôt ou tard. Voir un exemple de questions possibles à partir de plusieurs, voir JSch question - Ne peut pas récupérer la pleine commande de sortie
OriginalL'auteur vishy | 2014-09-11
Vous devez vous connecter pour publier un commentaire.
Pour 2) u peut utiliser
ByteArrayOutputStream
et ensuite créer de nouveaux chaîne de
new String(baos.toByteArray())
Pour 1 avez-vous essayé d'utiliser 2>,&1 à la fin de votre commande?
OriginalL'auteur Nikola Dimitrovski
Ma solution ne peut pas être plus nécessaire pour l'OP, mais quiconque est à la recherche d'une solution pour couvrir à la fois les conditions 1) d'attente pour les commandes à terminer sur la machine distante; et 2) la capture de la sortie comme une chaîne de caractères; vous pouvez essayer ceci:
Cette solution est également utile si vous devez envoyer plusieurs commandes à la fois et de garder le canal ouvert pour le réutiliser plus tard.
Ne pas utiliser
StrictHostKeyChecking=no
. Voir JSch SFTP de sécurité de la session.setConfig(“StrictHostKeyChecking”, “non”);.Le
out.println("#!/bin/bash");
est un pur non-sens. Le shell ignore toutes les commandes commençant par#
(commentaire). Il n'y a aucun point de l'envoyer.Observations précédentes, à côté, ne pas ignorer le fait que quelqu'un a pris le temps de poster un travail complet exemple qui s'ouvre avec succès un ssh connecter à un hôte, envoie une série de sortie pour que l'hôte de la session, et récupère et stocke les résultats. Et le design est bon, de l'OMI.
Je trouve la cartographie des flux d'entrée et de sortie des flux complet de l'esprit-bender en raison de ce que je pense sont bizarre les conventions de nommage. L'obtention d'un processus de flux de sortie en tant que contribution à un processus en cours d'exécution??
OriginalL'auteur Mihail
En prenant l'exemple fourni par Mihail, d'autres info sur les internets, et les commentaires de Martin, voici une version retravaillée de la solution à l'aide de
exec
. Notez que l'ouverture d'une session permet à plusieurs commandes à envoyer, chacun l'ouverture de son propre canal d'entrée/de sortie.Diatribe:je n'aime vraiment pas avoir à obtenir le processus de " SORTIE flux d'écrire. Quel ennuyeux paradigme (au moins pour moi). Ce que je voulais est le processus de flux d'entrée à écrire à ma sortie, et avait un incroyablement difficile, le temps de travail qu'il est inversé. Est-ce juste moi ou est le suivant (pseudo-code) de ne pas formuler de façon plus logique??
channel.getInputStream().write("here's some text to write into my channel.");
String ret = channel.getOutputStream().getOutput();
En tout cas, merci à Michel et Martin pour leurs commentaires /entrée.
est le PrintStream-même nécessaire? Je ne vous vois pas l'utiliser
il est dans mon commenté le code, mais vous avez raison, je pourrais commentaire aussi.
Il en est ainsi, C'était la bonne réponse pour moi.
OriginalL'auteur gdbj