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

Sécurité Java Discussion :

Connexion SSH et transfert fichier


Sujet :

Sécurité Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut Connexion SSH et transfert fichier
    Bonjour à tous,

    Je code actuellement une partie d'un programme qui me permettra d'envoyer un fichier XML (dans l'exemple j'ai mis txt) qui vient d'être créer par l'autre bout de programme à un serveur B tout en utilisant la librairie JSCH pour me connecter en SSH. Cependant, le gros problème est là. Je n'arrive pas à me connecter.

    Je me suis inspiré des différents exemples proposé sur le site de jsch cependant je n'arrive à rien.

    Voici mon programme :

    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
    import com.jcraft.jsch.*;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.Scanner;
     
    /**
     * @author World
     */
    public class SSHReadFile {
     
        public static void main(String args[]) {
            String user = "******";
            String password = "******";
            String host = "***.***.***.***";
            int port = **;
            String remoteFile = "****.txt";
     
            try {
                JSch jsch = new JSch();
                Session session = jsch.getSession(user, host, port);
                session.setPassword(password);
                session.setConfig("StrictHostKeyChecking", "no");
                System.out.println("Establishing Connection...");
                session.connect();
                System.out.println("Connection established.");
                System.out.println("Crating SFTP Channel.");
                ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
                sftpChannel.connect();
                System.out.println("SFTP Channel created.");
     
                InputStream inputStream = sftpChannel.get(remoteFile);
     
                try (Scanner scanner = new Scanner(new InputStreamReader(inputStream))) {
                    while (scanner.hasNextLine()) {
                        String line = scanner.nextLine();
                        System.out.println(line);
                    }
                }
            } catch (JSchException | SftpException e) {
            }
        }
    }
    J'ai besoin d'aide ou de lien qui puissent m'aider car là je suis perdu et ça fais une semaine..

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    J'ai maintenant réussi à établir une connexion et à faire une commande (par exemple supprimer un fichier).

    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
    import com.jcraft.jsch.*;
    import java.awt.*;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import javax.swing.*;
     
    public class Logger {
     
        public static void main(String[] arg) throws FileNotFoundException, IOException {
            String command1 = "rm chemin/fichier.html";
     
            try {
                JSch.setLogger(new MyLogger());
                JSch jsch = new JSch();
     
                Session session = jsch.getSession("******", "***.***.***.***", 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(command1);
                channel.connect();
                channel.disconnect();
                session.disconnect();
     
            } catch (JSchException e) {
                System.out.println(e);
            }
        }
     
        public static class MyLogger implements com.jcraft.jsch.Logger {
     
            static java.util.Hashtable name = new java.util.Hashtable();
     
            static {
                name.put(new Integer(DEBUG), "DEBUG: ");
                name.put(new Integer(INFO), "INFO: ");
                name.put(new Integer(WARN), "WARN: ");
                name.put(new Integer(ERROR), "ERROR: ");
                name.put(new Integer(FATAL), "FATAL: ");
            }
     
            @Override
            public boolean isEnabled(int level) {
                return true;
            }
     
            @Override
            public void log(int level, String message) {
                System.err.print(name.get(level));
                System.err.println(message);
            }
        }
     
        public static class MyUserInfo implements UserInfo, UIKeyboardInteractive {
     
            @Override
            public String getPassword() {
                return passwd;
            }
     
            @Override
            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);
     
            @Override
            public String getPassphrase() {
                return null;
            }
     
            @Override
            public boolean promptPassphrase(String message) {
                return true;
            }
     
            @Override
            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;
                }
            }
     
            @Override
            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;
     
            @Override
            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
                }
            }
        }
    }
    Cependant, ce que je cherches à faire maintenant c'est de transférer un fichier sur mon serveur à un chemin spécial.

    J'ai essayer d'utiliser les exemples qui ont été données sur le site de JSCH mais je ne comprends pas une partie du code.. Est ce que quelqu'un pourrait me l'expliquer ?

    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
        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();
     
          boolean ptimestamp = true;
     
          // exec 'scp -t rfile' remotely
          String command="scp " + (ptimestamp ? "-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);
          }
     
          File _lfile = new File(lfile);
     
          if(ptimestamp){
            command="T "+(_lfile.lastModified()/1000)+" 0";
            // The access time should be sent here,
            // but it is not accessible with JavaAPI ;-<
            command+=(" "+(_lfile.lastModified()/1000)+" 0\n"); 
            out.write(command.getBytes()); out.flush();
            if(checkAck(in)!=0){
      	  System.exit(0);
            }
          }
     
          // send "C0644 filesize filename", where filename should not include '/'
          long filesize=_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;
    }
    J'ai aussi vu la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    channel.put("fichier","fichier2");
    mais il me dit que la commande est inconnue (car selon moi ceci est pour le SFTP et non le SCP)

    Merci beaucoup de votre aide

  3. #3
    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
    Salut,

    Je ne saurai trop te répondre pour jSch.

    Mais si tu n'as d'autres solution, essaye peut être de te tourner vers SSHJ, on ne sait jamais ça m'a l'air plus simple a utiliser.
    (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

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Je regarde les exemples proposé sur GitHub mais ça me parait léger ! Je ne sais pas trop comment paramétrer ceci et je ne vois pas de programme concernant l'utilisation ou l'insertion d'un mot de passe.

    Je continue les recherches sur ce sujet.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Je trouve toujours rien, j'ai remarque qu'il y avait plein d'autre API permettant de faire une connexion SSH et d'utiliser le protocole SCP mais j'ai l'impression que c'est vraiment moins complet que JSCH.. J'ai poster un message sur sourceforge, j'attends une reponse.

    J'ai aussi essayer cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    String command6 = "scp Fichier/Source root@***.***.***.***:/Chemin/Finale";
    //Informations de connexion
    session.connect();
    Channel channel = session.openChannel("exec");
    ((ChannelExec) channel).setCommand(command6);
    channel.connect();
    channel.disconnect();
    session.disconnect();
    mais sans réussite ... J'ai l'impression que c'est impossible.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Par défaut
    Dans les exemples proposé je vois beaucoup de lecture pour en ensuite ré-écrire je crois. Mais, moi je veux transférer un fichier .tgz que je dois ensuite décompiler à l'aide de commande. Donc ça s'annonce encore bien plus compliquer non ?

Discussions similaires

  1. [XL-2013] VBA Excel - Macro - Connexion SSH afin de modifier un fichier
    Par lorenzo8769 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2016, 11h18
  2. Connexion ssh impossible
    Par le mage tophinus dans le forum Réseau
    Réponses: 6
    Dernier message: 12/07/2007, 13h37
  3. Problème de connexion SSH
    Par Bluelane dans le forum Réseau
    Réponses: 8
    Dernier message: 20/10/2005, 11h18
  4. [indy] connexion SSH
    Par nikhil dans le forum Web & réseau
    Réponses: 1
    Dernier message: 10/10/2005, 18h05
  5. [] [Réseau] Transfert fichier sur un FTP
    Par CYFL dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 26/02/2003, 17h33

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