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 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
|
public String sendCommandWithouthSecurityCheck(String hostname,String command,boolean forceExit) throws MyDomainException{
publicKeyValidThrowException();
Session session = null;
ChannelExec channel=null;
try(ByteArrayOutputStream outputStreamErr = new ByteArrayOutputStream()) {
session = jsch.getSession(USER_MM, hostname);
session.setConfig("StrictHostKeyChecking", "no");
session.setConfig("PreferredAuthentications","publickey,keyboard-interactive,password");//Permet de ne pas bloquer a l'attente du mot de passe de la session
session.connect(); //NoTimeout
channel= (ChannelExec)session.openChannel("exec");
channel.setInputStream(null);
channel.setErrStream(outputStreamErr);
channel.setCommand(command);
channel.connect();
String resultOut,resultErr;
try (InputStream is = channel.getInputStream()) {
resultOut = toString(is);
}
if(outputStreamErr.size()==0){
resultErr = null;
}else{
resultErr = outputStreamErr.toString();
}
//il faut deconnecter le channel avant de recuperer le retour code
channel.disconnect();
session.disconnect();
int nbRetry = 0;
while(!channel.isClosed() && !forceExit){
if(nbRetry>=NB_RETRY_CLOSE){
throw new MyDomainRollbackException("Impossible de fermer la connexion SSH de la '" + command + "' sur l'hote " + hostname+" apres "+NB_RETRY_CLOSE+" tentatives");
}
nbRetry++;
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
log.error("Timeout connexion SSH de la '" + command + "' sur l'hote " + hostname);
forceExit=true;
}
}
if(nbRetry!=0){
log.warn("Fermeture de la connexion SSH de la '" + command + "' sur l'hote " + hostname + " apres " + nbRetry+" tentatives");
}
int exitStatus = channel.getExitStatus();
if (exitStatus == 0) {
log.info("Command '" + command + "' execute sur l'hote " + hostname + " : '" + resultOut+"'");
return resultOut;
} else {
if(exitStatus == -1){
log.error("Le canal SSH n'a pas ete correctement ferme avant la recuperation du retour code de la commande '" + command + "' sur l'hote " + hostname + " (test canal ferme via API : " + channel.isClosed() +", nombre de retry : "+nbRetry+", force exit : "+forceExit+")");
}
if (resultErr == null) {
throw new MyCommandException("Une erreur est survenue lors de l'execution de la commande '" + command + "' sur l'hote " + hostname + " (exit code " + exitStatus + ")",exitStatus,resultErr);
} else {
throw new MyCommandException("Une erreur est survenue lors de l'execution de la commande '" + command + "' sur l'hote " + hostname + " : '" + resultErr + "' (exit code " + exitStatus + ")",exitStatus,resultErr);
}
}
} catch (JSchException | IOException ex) {
throw new MyDomainRollbackException(ex);
} finally {
if (channel != null && !channel.isClosed()) {
channel.disconnect();
}
if (session != null && session.isConnected()) {
session.disconnect();
}
}
}
-------------
Je n'ai pas tout mis
ExecutorService executor = Executors.newFixedThreadPool(NTHREDS);
List<Future<String>> list = new ArrayList<Future<String>>();
for (int cpt = 0; cpt < max; cpt++) {
Callable<String> worker = new MyCallableB(cpt, show, s);
Future<String> submit = executor.submit(worker);
list.add(submit);
}
for (Future<String> future : list) {
try {
rt = future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
} |
Partager