exécution de plusieurs scripts shell à l’aide de jsch

J’utilise la bibliothèque Jsch pour exécuter environ 1000 scripts shell différents sur quelques machines Linux et mettre à jour le statut dans une table.

J’ai utilisé le canal jsch exec [ChannelExec], il ne fonctionnait que pour un seul script, si le script shell appelait un autre script, ChannelExec ne donnait pas de résultat correct.

maintenant j’utilise le canal de shell de jsch. il fonctionne bien pour obtenir une sortie de n’importe quel script shell.

Le problème est que si j’exécute plusieurs scripts shell en même temps, je reçois tous un résultat unique.

Il n’y a aucun moyen de faire exécuter un script Shell et son résultat reçu.

Si je veux obtenir des résultats d’exécution de scripts individuels, je dois me connecter à la machine pour chaque exécution de script, cela prend beaucoup de temps.

Quelqu’un peut-il poster une solution, suggérer comment s’y prendre, se connecter une fois à la machine et exécuter plusieurs scripts et recevoir chaque résultat de script individuellement.

import com.jcraft.jsch.Channel; import com.jcraft.jsch.JSch; import com.jcraft.jsch.JSchException; import com.jcraft.jsch.Session; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; public class JschShellExample { public static void main(Ssortingng[] args) { try { JSch jsch = new JSch(); Session session = jsch.getSession("user", "10.32.248.158", 22); session.setPassword("password"); java.util.Properties config = new java.util.Properties(); config.put("SsortingctHostKeyChecking", "no"); config.put("PreferredAuthentications","publickey,keyboard-interactive,password"); session.setConfig(config); session.connect(100); Channel channel = session.openChannel("shell"); OutputStream inputstream_for_the_channel = channel.getOutputStream(); PrintStream commander = new PrintStream(inputstream_for_the_channel, true); channel.setOutputStream(null); channel.connect(100); //shell script commander.println("cd /user/home/work ; ./checkstaus.sh ; exit"); commander.flush(); System.out.println(channel.getExitStatus()); InputStream outputstream_from_the_channel = channel.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(outputstream_from_the_channel)); Ssortingng line = null; SsortingngBuilder sb = new SsortingngBuilder(); boolean isloginSsortingngPassed = false ; while ((line = br.readLine()) != null) { sb.append(line.sortingm()); } System.out.println("Result ="+sb.toSsortingng()); channel.disconnect(); session.disconnect(); System.out.println("completed .. "); } catch (JSchException ex) { ex.printStackTrace(); } catch (IOException ex) { ex.printStackTrace(); } catch (Exception ex) { ex.printStackTrace(); } } } 

Habituellement, lorsque vous vous connectez à une machine distante pour la première fois et après avoir exécuté une commande, vous obtenez une invite de ligne de commande shell imprimée sur le stream de sortie. Vous pouvez l’utiliser comme marqueur entre les différentes commandes du shell.

Vous pouvez envisager d’utiliser une bibliothèque tierce de type Expect- simplification qui simplifie l’utilisation de services distants et la capture de sortie. Il y a un bon ensemble d’options que vous pouvez essayer:

  • Expect4J
  • AttendreJ
  • Attendez-vous pour Java

Cependant, lorsque j’étais sur le sharepoint résoudre un problème similaire, j’ai trouvé que ces bibliothèques étaient plutôt anciennes et difficiles à utiliser dans un logiciel commercial. J’ai donc créé les miens et les ai mis à la disposition des autres. Ça s’appelait ExpectIt . Les avantages de ma bibliothèque sont indiqués sur la page d’accueil du projet .

Voici un exemple d’interaction avec un service SSH distant public:

  JSch jSch = new JSch(); Session session = jSch.getSession("new", "sdf.org"); Properties config = new Properties(); config.put("SsortingctHostKeyChecking", "no"); session.setConfig(config); session.connect(); Channel channel = session.openChannel("shell"); Expect expect = new ExpectBuilder() .withOutput(channel.getOutputStream()) .withInputs(channel.getInputStream(), channel.getExtInputStream()) .withEchoOutput(adapt(System.out)) // .withInputFilters(removeColors(), removeNonPrintable()) .withErrorOnTimeout(true) .build(); // try-with-resources is omitted for simplicity channel.connect(); expect.expect(contains("[RETURN]")); expect.sendLine(); Ssortingng ipAddress = expect.expect(regexp("Trying (.*)\\.\\.\\.")).group(1); System.out.println("Captured IP: " + ipAddress); expect.expect(contains("login:")); expect.sendLine("new"); expect.expect(contains("(Y/N)")); expect.send("N"); expect.expect(regexp(": $")); // finally is omitted channel.disconnect(); session.disconnect(); expect.close(); 

Vous pouvez également examiner cet exemple en interagissant avec un shell Karaf qui capture une sortie de commande individuelle.