IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

copier via ssh en java


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut copier via ssh en java
    Bonjour à tous.
    J'ai un petit probléme:
    je développe actuellement une interface en java permettant de faire des traitements sur des fichiers.
    On me demande de pouvoir copier un dossier d'une machine à une autre en utilisant cette interface.
    Et pour ce faire, je dois utiliser le protocole SSH.
    Je ne connait pas trop SSH. Je vois comment executer une ligne de commande en java. Mais mon probléme concerne le mot de passe.
    En effet pour faire une copie de fichier via SCP par exemple, il y a une demande de mot de passe.
    Je voudrais savoir comment je peux m'en sortir pour ne donner qu'une fois le mot de passe dans mon interface java, et que SCP puisse le récupérer au bon moment.
    Merci à tous

  2. #2
    Modérateur
    Avatar de wax78
    Homme Profil pro
    R&D - Palefrenier programmeur
    Inscrit en
    Août 2006
    Messages
    4 095
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : R&D - Palefrenier programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 095
    Par défaut
    Pourquoi utiliser la ligne de commande alors que tu px trouver des belle librairies bien faite pour le ssh, comme JSCH, qui a mon avis sera plus maniable ?

    Et puis sinon pour SCP il faut generer les clé etc ... http://www.linuxjournal.com/article/8600 ou alors http://linux.101hacks.com/unix/ssh-controlmaster/
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    Merci pour l'info
    c'est une bonne idée, je suis en train d'essayer de me débrouiller avec JSch, mais ce n'est pas simple.
    J'ai trouver un exemple de code sur le site pour pouvoir faire du scp
    ca donne :
    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
     
    JSch jsch=new JSch();
          Session session=jsch.getSession(user, host, 22);
     
          // username and password will be given via UserInfo interface.
          UserInfo ui=new MyUserInfo();
          session.setUserInfo(ui);
          session.connect();
     
          // exec 'scp -f rfile' remotely
          String command="scp -f "+rfile;
     
          Channel channel=session.openChannel("shell");
          ((ChannelExec)channel).setCommand(command);
     
          // get I/O streams for remote scp
          OutputStream out=channel.getOutputStream();
          InputStream in=channel.getInputStream();
     
          channel.connect();
    mais le scp -f ne correspond a rien, et ne copie pas mon fichier
    j'ai par ailleur essayé un autre 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
      try{ 
    		      JSch jsch=new JSch(); 
     
    		      String host=JOptionPane.showInputDialog("Enter username@hostname",System.getProperty("user.name")+ "@localhost"); 
     
    		      String user=host.substring(0, host.indexOf('@')); 
    		      host=host.substring(host.indexOf('@')+1); 
     
    		      Session session=jsch.getSession(user, host, 22); 
     
    		      // username and passphrase will be given via UserInfo interface. 
    		      UserInfo ui=new MyUserInfo(); 
    		      session.setUserInfo(ui); 
    		      session.connect(); 
     
    		      Channel channel=session.openChannel("shell"); 
     
    		      channel.setInputStream(System.in); 
    		      channel.setOutputStream(System.out); 
     
    		      channel.connect(); 
     
    		      channel.
    		    } 
    		    catch(Exception e){ 
    		    	 System.out.println("exeption");
    		      System.out.println(e); 
    		    } 
    		  }
    mais je ne vois pas du coup comment executer mon code: chanel. ???
    merci d'avance

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut
    Bon en fait j'avais pas utilisé le bon code
    Avec celui la ca marche:
    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
    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    package analysis.utils;
    import com.jcraft.jsch.*;
    import java.awt.*;
    import javax.swing.*;
    import java.io.*;
     
    public class SSHUtils{
      public static void main(String[] arg2){
    	  String arg[]=new String[2];
     
     
    	  if(arg.length!=2){
    	      System.err.println("usage: java ScpTo file1 user@remotehost:file2");
    	      System.exit(-1);
    	    }      
     
    	    FileInputStream fis=null;
    	    try{
     
    	  String lfile=arg[0];
          String user=arg[1].substring(0, arg[1].indexOf('@'));
          arg[1]=arg[1].substring(arg[1].indexOf('@')+1);
          String host=arg[1].substring(0, arg[1].indexOf(':'));
          String rfile=arg[1].substring(arg[1].indexOf(':')+1);
     
          JSch jsch=new JSch();
          Session session=jsch.getSession(user, host, 22);
     
          // username and password will be given via UserInfo interface.
          UserInfo ui=new MyUserInfo();
          session.setUserInfo(ui);
          session.connect();
     
     
          // exec 'scp -t rfile' remotely
          String command="scp -p -t "+rfile;
          Channel channel=session.openChannel("exec");
          ((ChannelExec)channel).setCommand(command);
     
          // get I/O streams for remote scp
          OutputStream out=channel.getOutputStream();
          InputStream in=channel.getInputStream();
     
          channel.connect();
     
          if(checkAck(in)!=0){
    	System.exit(0);
          }
     
          // send "C0644 filesize filename", where filename should not include '/'
          long filesize=(new File(lfile)).length();
          command="C0644 "+filesize+" ";
          if(lfile.lastIndexOf('/')>0){
            command+=lfile.substring(lfile.lastIndexOf('/')+1);
          }
          else{
            command+=lfile;
          }
          command+="\n";
          out.write(command.getBytes()); out.flush();
          if(checkAck(in)!=0){
    	System.exit(0);
          }
     
          // send a content of lfile
          fis=new FileInputStream(lfile);
          byte[] buf=new byte[1024];
          while(true){
            int len=fis.read(buf, 0, buf.length);
    	if(len<=0) break;
            out.write(buf, 0, len); //out.flush();
          }
          fis.close();
          fis=null;
          // send '\0'
          buf[0]=0; out.write(buf, 0, 1); out.flush();
          if(checkAck(in)!=0){
    	System.exit(0);
          }
          out.close();
     
          channel.disconnect();
          session.disconnect();
     
          System.exit(0);
        }
        catch(Exception e){
          System.out.println(e);
          try{if(fis!=null)fis.close();}catch(Exception ee){}
        }
      }
     
      static int checkAck(InputStream in) throws IOException{
        int b=in.read();
        // b may be 0 for success,
        //          1 for error,
        //          2 for fatal error,
        //          -1
        if(b==0) return b;
        if(b==-1) return b;
     
        if(b==1 || b==2){
          StringBuffer sb=new StringBuffer();
          int c;
          do {
    	c=in.read();
    	sb.append((char)c);
          }
          while(c!='\n');
          if(b==1){ // error
    	System.out.print(sb.toString());
          }
          if(b==2){ // fatal error
    	System.out.print(sb.toString());
          }
        }
        return b;
      }
     
      public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{
        public String getPassword(){ return passwd; }
        public boolean promptYesNo(String str){
          Object[] options={ "yes", "no" };
          int foo=JOptionPane.showOptionDialog(null, 
                 str,
                 "Warning", 
                 JOptionPane.DEFAULT_OPTION, 
                 JOptionPane.WARNING_MESSAGE,
                 null, options, options[0]);
           return foo==0;
        }
     
        String passwd;
        JTextField passwordField=(JTextField)new JPasswordField(20);
     
        public String getPassphrase(){ return null; }
        public boolean promptPassphrase(String message){ return true; }
        public boolean promptPassword(String message){
          Object[] ob={passwordField}; 
          int result=
    	  JOptionPane.showConfirmDialog(null, ob, message,
    					JOptionPane.OK_CANCEL_OPTION);
          if(result==JOptionPane.OK_OPTION){
    	passwd=passwordField.getText();
    	return true;
          }
          else{ return false; }
        }
        public void showMessage(String message){
          JOptionPane.showMessageDialog(null, message);
        }
        final GridBagConstraints gbc = 
          new GridBagConstraints(0,0,1,1,1,1,
                                 GridBagConstraints.NORTHWEST,
                                 GridBagConstraints.NONE,
                                 new Insets(0,0,0,0),0,0);
        private Container panel;
        public String[] promptKeyboardInteractive(String destination,
                                                  String name,
                                                  String instruction,
                                                  String[] prompt,
                                                  boolean[] echo){
          panel = new JPanel();
          panel.setLayout(new GridBagLayout());
     
          gbc.weightx = 1.0;
          gbc.gridwidth = GridBagConstraints.REMAINDER;
          gbc.gridx = 0;
          panel.add(new JLabel(instruction), gbc);
          gbc.gridy++;
     
          gbc.gridwidth = GridBagConstraints.RELATIVE;
     
          JTextField[] texts=new JTextField[prompt.length];
          for(int i=0; i<prompt.length; i++){
            gbc.fill = GridBagConstraints.NONE;
            gbc.gridx = 0;
            gbc.weightx = 1;
            panel.add(new JLabel(prompt[i]),gbc);
     
            gbc.gridx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;
            gbc.weighty = 1;
            if(echo[i]){
              texts[i]=new JTextField(20);
            }
            else{
              texts[i]=new JPasswordField(20);
            }
            panel.add(texts[i], gbc);
            gbc.gridy++;
          }
     
          if(JOptionPane.showConfirmDialog(null, panel, 
                                           destination+": "+name,
                                           JOptionPane.OK_CANCEL_OPTION,
                                           JOptionPane.QUESTION_MESSAGE)
             ==JOptionPane.OK_OPTION){
            String[] response=new String[prompt.length];
            for(int i=0; i<prompt.length; i++){
              response[i]=texts[i].getText();
            }
    	return response;
          }
          else{
            return null;  // cancel
          }
        }
      }
    }
    Merci de m'avoir orienté vers cette solution

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 4
    Par défaut scp recursif
    En fait aprés maint essais, je suis encore blocké.
    Ce code marche bien pour la copie d'un fichier, mais je n'ai pas réussi à faire une cpie récursive, or j'ai besoin de copier un dossier contenant d'autres dossiers.
    Sur google j'ai rencontré plusieurs personne utilisant jcsh mais personne qui ais fais ca.
    Quelqu'un connait un peu jsch et pourrais m'indiquer comment faire?
    Merci à tous

  6. #6
    Membre expérimenté
    Homme Profil pro
    Analyst
    Inscrit en
    Juillet 2008
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Analyst
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 150
    Par défaut
    Pour des copies entières de dossiers, j'utilise Ant (avec la lib jsch dans le dossier) avec la balise scp.

    Sinon, tu n'es pas obligé d'exécuter une commande (channel avec "exec").
    http://www.matt-reid.co.uk/blog_post.php?id=56
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
    		channel.connect();
     
     
    		final Vector<LsEntry> files = channel.ls(".");
            for (LsEntry obj : files) {
                System.out.println(obj.toString());
            }	
     
    channel.disconnect();
    session.disconnect();

Discussions similaires

  1. Ligne de commande pour copier un dossier via SSH
    Par Daikyo dans le forum Administration système
    Réponses: 4
    Dernier message: 29/09/2009, 22h21
  2. Connexion java à une BDD MySQL distante via SSH
    Par onigami dans le forum JDBC
    Réponses: 3
    Dernier message: 16/04/2008, 13h47
  3. Comment sauvegarder MySQL via SSH ?
    Par Blade dans le forum Administration
    Réponses: 7
    Dernier message: 30/09/2004, 14h03
  4. [cvs] Jbuilder 9, Cvs Via Ssh Sous Windows
    Par SurfingPoP dans le forum JBuilder
    Réponses: 3
    Dernier message: 13/02/2004, 15h57
  5. copier via flash ??
    Par seth dans le forum Flash
    Réponses: 2
    Dernier message: 20/01/2003, 13h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo