Bonjour,
je suis actuellement en train de développer un outil qui ouvre depuis windows un shell unix sur une machine distante afin d'y exécuter des commandes et récupérer les résultats.
Pour ce faire j'utilise l'api JSCH, et j'ai repris le code suivant que j'ai plus ou moins adapté : Bonjour,
je suis actuellement en train de développer un outil qui ouvre depuis windows un shell unix sur une machine distante afin d'y exécuter des commandes et récupérer les résultats.
Pour ce faire j'utilise l'api JSCH, et j'ai repris le code suivant que j'ai plus ou moins adapté : http://blog.james-carr.org/2006/07/11/ssh-over-java/.
voici mon code
(j'ai fait exprès de séparer les & dans le if sinon j'arrivais pas à l'afficher dans le post, mais dans le code c'est collé)
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 private static final String DONE = "zDonez"; public void send(String command) throws IOException, InterruptedException { command += "; echo \"" + DONE + "\"\n"; toServer.write(command.getBytes()); toServer.flush(); Thread.sleep(100); lastCommand = new String(command); } public String getServerResponse() throws IOException, InterruptedException { StringBuilder builder = new StringBuilder(); int count = 0; String line = ""; Thread.sleep(100); BufferedReader reader = new BufferedReader(new InputStreamReader(fromServer)); for (int i = 0; true; i++) { line = reader.readLine(); builder.append(line).append("\n"); if (line.indexOf(DONE) != -1 & & (++count > 1)) { break; } } String result = builder.toString(); int beginIndex = result.indexOf(DONE+"\"") + ((DONE+"\"").length()); result = result.substring(beginIndex); return result.replaceAll(escape(DONE), "").trim(); } public static void main(String[] args){ try{ SSHConnection sSHConnection = new SSHConnection(); sSHConnection.connect(serveur); String reponse = ""; sSHConnection.send("sleep 3; echo toto"); reponse = sSHConnection.getServerResponse(); System.out.println(reponse); sSHConnection.disconnect(); }catch(Exception e){ e.printStackTrace(); } }
Mon problème réside dans la récupération des résultats des commandes. Comme certaines commandes mettent un certain temps à s’exécuter, le code récupère la valeur de retour avant que le traitement de ma commande n'ai été fini, je n'ai donc pas toujours le résultat.
Dans mon exemple de test, je fait un "sleep 3" suivit d'un "echo toto", cependant je n'obtiens pas le résultat du echo à chaque fois
J'ai essayé de faire en sorte que le getServerReponse attende avant de traiter la réponse mais ce n'est pas concluant du tout.
Y a t'il un moyen de dire : tant que je ne reçois pas de nouvelles données dans le pipe (fromServer) j'attends?
J'ai essayé de faire une différence entre le contenu de fromServer avant de lancer la commande et après (available()), et ne traiter le résultat que si c'est différent.
Le problème c'est que c'est toujours différent puisque dans le retour je reçois la commande entrée ainsi que le prompt...
Si quelqu'un à une idée pour m'aider à récupérer la réponse du serveur à tous les coups.
Merci
Partager