Jsch - Une Session De Multiples Canaux
J'ai réussi à exécuter une seule commande par ssh avec Jsch mais quand j'essaie d'exécuter une deuxième commande, il ne parvient pas
Pour le débogage j'ai apporté ce problème à ces lignes:
import java.io.IOException;
import java.io.InputStream;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
public class Exec {
public static void test(Session session) throws Exception {
Channel channel = session.openChannel("exec");
((ChannelExec) channel).setCommand("pwd");
channel.setInputStream(null);
((ChannelExec) channel).setErrStream(System.err);
InputStream in = channel.getInputStream();
channel.connect();
byte[] tmp = new byte[1024];
while (true) {
while (in.available() > 0) {
int i = in.read(tmp, 0, 1024);
if (i < 0)
break;
System.out.print(new String(tmp, 0, i));
}
if (channel.isClosed()) {
System.out.println("exit-status: " + channel.getExitStatus());
break;
}
try {
Thread.sleep(1000);
} catch (Exception ee) {
}
}
channel.disconnect();
}
public static void main(String[] arg) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession("nck", "127.0.0.1", 22);
session.setPassword("asd");
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
test(session); //This one succeeds with exit-status: 0
test(session); //This one fails with exit-status: 255
session.disconnect();
} catch (Exception e) {
//
}
}
}
C'est surtout l'officiel Exec exemple, mais cela me donne ce résultat:
/home/nck
exit-status: 0
exit-status: 255
La première commande est exécutée avec succès, le deuxième ne marche pas.
Des Idées ?
Il fonctionne pour moi. (Avec une version personnalisée basée sur 0.1.45-rc5 - il pourrait être que vous avez touché un bug qui a été récemment fixé.)
OriginalL'auteur Nick Russler | 2011-08-26
Vous devez vous connecter pour publier un commentaire.
Hey j'ai exactement le même problème avec jsch et Ubuntu. (Comment) avez-vous le résoudre? La fabrication d'une nouvelle session pour chaque exécution mange trop de temps? Au moment où j'attrape le jsch exception et de la recherche pour "session n'est pas vers le bas" puis-je me reconnecter la session et de l'exécuter à nouveau la commande. Qui fonctionne mais n'est pas une bonne solution.
Edit: j'ai été sur le mauvais chemin, j'ai résolu mon problème pour l'instant en utilisant
channel = session.openChannel("shell");
au lieu de "exec".
OriginalL'auteur Simon Schubert
Ici est un travail complet de la classe Java basé sur @krishna réponse:
OriginalL'auteur Serge Merzliakov
vous pouvez utiliser le shell pour exécuter plusieurs commandes.
voici le code à exécuter des commandes via le shell.
OriginalL'auteur krishna
J'ai utilisé exactement le même code et eu de problème de temps en temps la lecture de la sortie du script que j'ai exécuté par ssh. Parfois, le programme n'avait pas sa tout le contenu, et parfois seulement une partie du contenu.
J'ai résolu mon problème en changeant le si(canal.isclosed) dans la boucle imbriquée.
Voici le nouveau code
OriginalL'auteur davidbobo
Si vous souhaitez utiliser exec. vous pouvez exécuter plusieurs commandes en plaçant un point-virgule (;) dans les commandes
comme:
OriginalL'auteur Musaddique
Ce n'était pas un bug dans jsch, c'était un bug de mon serveur ssh (cygwin - je parie que je l'ai configuré quelque chose de mal...)
Edit: hmm j'ai eu le même problème avec jsch avec Ubuntu ... bizarre
Suppose que workarround je vais devoir ouvrir une nouvelle session pour chaque requête.
OriginalL'auteur Nick Russler