Bonjour à tous,

Je dois faire un ssh depuis Java sur un serveur, et exécuter des commandes sur ce serveur (genre créer un dossier, changer les droits dessus, copier quelque chose ailleurs, etc)...

J'utilise JSch de JCraft... Dans les exemples qu'ils donnent, on peut effectuer une commande... Voilà le code :

Code : 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
 
public static void main(String[] arg){
try{
      JSch jsch=new JSch();  
 
      Session session=jsch.getSession("root", "192.168.53.23", 22);
 
      // username and password will be given via UserInfo interface.
      UserInfo ui=new MyUserInfo();
      session.setUserInfo(ui);
      session.connect();
 
      Channel channel=session.openChannel("exec");
      ((ChannelExec)channel).setCommand("mkdir java1");
 
      //ca devient très flou pour moi à partir d'ici...
      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();      
      session.disconnect();
    }
    catch(Exception e){
      System.out.println(e);
    }
  }
Le problème, c'est que je ne comprend pas tout... Et du coup, je n'arrive pas à lui faire exécuter plusieurs commandes...
A quoi correspond exactement un Channel ? Est-ce que je dois en créé un nouveau pour pouvoir faire une autre commande ? Est-ce que je dois lui affecter à nouveau une commande puis le reconnecter ? Dans le code, je ne le ferme pas explicitement... Donc il se ferme tout seul... Mais à quel moment ? et pourquoi ? Quelle est la différence entre close et disconnect ?

Et à quoi sert l'InputStream dans ce code ? En particulier quand il est mis à null...

Et la boucle while, elle sert à quoi ? On attend quoi ? et le byte[] tmp ??? Je ne comprend vraiment pas son utilitée...

Je sais, c'est beaucoup de questions, mais si je ne comprend pas l'exemple en détail, je ne pourrai pas essayer de lui faire d'autres commandes à la suite et de faire une gestion d'erreur en récupérant le code erreur à la suite de chaque commande...

Merci d'avance pour vos lumières...