JSch: comment maintenir la session en vie
Je suis en train d'écrire Java GUI programme pour la statique de la gestion de l'itinéraire à l'aide de SSH. Mon code est comme suit:
import com.jcraft.jsch.*;
import java.io.*;
public class Konsep {
String status;
static String username;
static String hostname;
String inputcommand;
String output;
static Session session;
JSch jsch = new JSch();
public String status(String stringstatus) {
stringstatus = status;
return stringstatus;
}
public String InputCommand(String inputcommandstatus) {
inputcommandstatus = inputcommand;
return inputcommandstatus;
}
public void connect(String usernamelokal, String hostnamelokal,
String password, int port) {
// JSch jsch=new JSch();
try {
Session sessionlokal = jsch.getSession(usernamelokal,
hostnamelokal, port);
sessionlokal.setPassword(password);
UserInfo ui = new UserInfoku.Infoku();
sessionlokal.setUserInfo(ui);
sessionlokal.setTimeout(0);
sessionlokal.connect();
status = "tersambung \n";
username = usernamelokal;
hostname = hostnamelokal;
session = sessionlokal;
System.out.println(username + " " + hostname);
} catch (Exception e) {
System.out.println(e);
status = "Exception = \n " + e + "\n";
}
}
public void disconnect() {
// JSch jsch=new JSch();
try {
Session sessionlokal = jsch.getSession(username, hostname);
// System.out.println(username +" "+ hostname);
sessionlokal.disconnect();
status = "wes pedhoott \n";
} catch (Exception e) {
System.out.println(e);
status = "Exception = \n " + e + "\n";
}
}
public void addRoute() {
// JSch jsch=new JSch();
System.out.println(username + " " + hostname);
try {
Session sessionlokal = session; //=jsch.getSession(username, hostname);
Channel channel = sessionlokal.openChannel("exec");
((ChannelExec) channel).setCommand(inputcommand);
channel.setInputStream(null);
channel.connect();
((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();
} catch (Exception e) {
System.out.println(e);
}
}
}
Le problème est que lorsque j'appelle la méthode de connexion, puis d'appeler la addroute, le programme renvoie
root 192.168.50.2
root 192.168.50.2
com.jcraft.jsch.JSchException: session is down
J'ai essayé d'obtenir le statut de la session, soit avec
Session sessionlokal=session; //returns com.jcraft.jsch.JSchException: ChannelExec
ou
Session sessionlokal=jsch.getSession(username, hostname); //returns session is down
J'ai aussi essayé d'utiliser le keepalive, mais sa ne fonctionne pas non plus.
Mon intention est de créer une session sur l'hôte (log in), tout en laissant la séance, exécuter une commande ou des commandes, et peut-être l'exécution d'autres commandes plus tard, et puis de la fermeture de la session lorsqu'il n'est pas nécessaire (fin de session).
J'ai cherché sur ce forum et j'ai trouvé ce question mais le code est de créer une méthode pour définir une commande à exécuter en premier, puis la création de la session, appelez la commande de la méthode et de fermer la session.
Des idées sur la façon de le faire comme je l'ai mentionné ci-dessus ?
source d'informationauteur user2277956
Vous devez vous connecter pour publier un commentaire.
Après avoir essayé
Session.sendKeepAliveMsg()
sans succès, j'en suis venu à la solution suivante qui semble être plutôt stable:Mise à jour: Quelques jours plus tard, il a échoué.
J'ai essayé de le tester en tuant la session ouverte sur le serveur. Toutes les versions antérieures, j'ai testé de cette façon ont montré le même comportement, quel que soit wheater le problème poped en place après une attente de quelques jours ou de tuer le processus de serveur, j'ai donc pensé que ce test et son résultat pour la solution ci-dessus - pour être significatif. Malheureusement, il n'est pas.
Je vais essayer d'autres façons de le corriger et de vous garder à jour.
Mise à jour 2: la solution Finale, garanti unelegant et de travail:
Cette version fonctionne plusieurs semaines dans un environnement de production. Une fois un jour j'ai le message d'information, connecté.
Les coûts de l'ouverture d'un canal et de l'exécution de certains ne-rien-commande sont un peu ennuyeux, mais je n'ai pas trouvé d'autre moyen d'être absolument sûr de l'état de la session.
Vous pouvez essayer en invoquant la méthode suivante avant d'invoquer Session#connect().
Session#setServerAliveInterval(int millisecondes)
Même si j'ai trouvé une autre fonction Session#sendKeepAliveMsg() qui peut être essayé.