Question

Quelle est la meilleure méthode pour effectuer un transfert scp via le langage de programmation Java? Il semble que je puisse être capable de le faire via JSSE, JSch ou les bibliothèques java du château gonflable. Aucune de ces solutions ne semble avoir une réponse facile.

Était-ce utile?

La solution

J'ai fini par utiliser Jsch . C'était assez simple et semblait bien évoluer ( Je récupérais quelques milliers de fichiers toutes les quelques minutes).

Autres conseils

plug: sshj est le seul choix sensé! Voir ces exemples pour commencer: télécharger , télécharger .

Consultez ici

C'est le code source de la tâche SCP d'Ants. Le code dans le fichier " execute " méthode est où les écrous et les boulons de celui-ci sont. Cela devrait vous donner une idée juste de ce qui est requis. Il utilise JSch je crois.

Vous pouvez également exécuter directement cette tâche Ant à partir de votre code Java.

J'ai enveloppé Jsch avec des méthodes utilitaires pour le rendre un peu plus convivial et je l'ai appelé

Jscp

Disponible ici: https://github.com/willwarren/jscp

Utilitaire SCP permettant de tarer un dossier, de le compresser et de le scp quelque part, puis de le décompresser.

Utilisation:

// create secure context
SecureContext context = new SecureContext("userName", "localhost");

// set optional security configurations.
context.setTrustAllHosts(true);
context.setPrivateKeyFile(new File("private/key"));

// Console requires JDK 1.7
// System.out.println("enter password:");
// context.setPassword(System.console().readPassword());

Jscp.exec(context, 
           "src/dir",
           "destination/path",
           // regex ignore list 
           Arrays.asList("logs/log[0-9]*.txt",
           "backups") 
           );

Inclut également des classes utiles - Scp et Exec, et un TarAndGzip, qui fonctionnent à peu près de la même manière.

Il s'agit d'une solution de haut niveau , inutile de réinventer. Rapide et sale!

1) Tout d'abord, accédez à http: //ant.apache. org / bindownload.cgi et téléchargez le dernier binaire Apache Ant. (de nos jours, apache-ant-1.9.4-bin.zip).

2) Extrayez le fichier téléchargé et recherchez le fichier JAR ant-jsch.jar ("apache-ant-1.9.4 / lib / ant-jsch.jar"). ;). Ajoutez ce fichier JAR à votre projet . Aussi ant-launcher.jar et ant.jar.

3) Accédez à Jcraft jsch SouceForge Project et téléchargez le pot. De nos jours, jsch-0.1. 52.jar . Ajoutez également ce fichier JAR à votre projet .

Maintenant, pouvez-vous facilement utiliser en code Java Ant Classes Scp pour copier des fichiers sur le réseau ou SSHExec pour des commandes sur des serveurs SSH.

4) Exemple de code Scp:

// This make scp copy of 
// one local file to remote dir

org.apache.tools.ant.taskdefs.optional.ssh.Scp scp = new Scp();
int portSSH = 22;
String srvrSSH = "ssh.your.domain";
String userSSH = "anyuser"; 
String pswdSSH = new String ( jPasswordField1.getPassword() );
String localFile = "C:\\localfile.txt";
String remoteDir = "/uploads/";

scp.setPort( portSSH );
scp.setLocalFile( localFile );
scp.setTodir( userSSH + ":" + pswdSSH + "@" + srvrSSH + ":" + remoteDir );
scp.setProject( new Project() );
scp.setTrust( true );
scp.execute();

Le projet openssh répertorie plusieurs alternatives Java, Trilead SSH pour Java semble répondre à vos attentes.

J'utilise cette API SFTP qui a SCP appelé Zehon, c'est génial, donc facile à utiliser avec beaucoup d'exemples de code. Voici le site http://www.zehon.com

J'ai examiné beaucoup de ces solutions et je n’en ai pas aimé beaucoup. Principalement parce que l'étape ennuyeuse d'avoir à identifier vos hôtes connus. Cela et JSCH est à un niveau ridiculement bas par rapport à la commande scp.

J'ai trouvé une bibliothèque qui n'en nécessite pas, mais elle est fournie et utilisée comme outil de ligne de commande. https://code.google.com/p/scp-java-client/

J'ai parcouru le code source et découvert comment l'utiliser sans la ligne de commande. Voici un exemple de téléchargement:

    uk.co.marcoratto.scp.SCP scp = new uk.co.marcoratto.scp.SCP(new uk.co.marcoratto.scp.listeners.SCPListenerPrintStream());
    scp.setUsername("root");
    scp.setPassword("blah");
    scp.setTrust(true);
    scp.setFromUri(file.getAbsolutePath());
    scp.setToUri("root@host:/path/on/remote");
    scp.execute();

L’inconvénient majeur est que ce n’est pas dans un repo maven (que j’ai pu trouver). Mais, la facilité d'utilisation en vaut la peine pour moi.

Comme certains ici, j'ai fini par écrire un wrapper autour de la bibliothèque JSch.

Cela s'appelle way-secshell et il est hébergé sur GitHub:

https://github.com/objectos/way-secshell

// scp myfile.txt localhost:/tmp
File file = new File("myfile.txt");
Scp res = WaySSH.scp()
  .file(file)
  .toHost("localhost")
  .at("/tmp")
  .send();

J'ai écrit un serveur scp qui est beaucoup plus facile que d'autres. J'utilise le projet Apache MINA (Apache SSHD) pour le développer. Vous pouvez y jeter un coup d'œil ici: https://github.com/boomz/JSCP Vous pouvez également télécharger le fichier jar à partir du répertoire / jar . Comment utiliser? Jetez un coup d'œil sur: https://github.com/boomz/JSCP/ blob / master / src / Main.java

jsCH a très bien fonctionné pour moi. Vous trouverez ci-dessous un exemple de méthode permettant de se connecter au serveur sftp et de télécharger des fichiers dans le répertoire spécifié. Il est recommandé d'éviter de désactiver StrictHostKeyChecking. Bien que ce soit un peu plus difficile à configurer, pour des raisons de sécurité, spécifier les hôtes connus devrait être la norme.

jsch.setKnownHosts ("C: \ Utilisateurs \ test \ known_hosts"); recommandé

JSch.setConfig ("StrictHostKeyChecking", "no"); - non recommandé

import com.jcraft.jsch.*;
 public void downloadFtp(String userName, String password, String host, int port, String path) {


        Session session = null;
        Channel channel = null;
        try {
            JSch ssh = new JSch();
            JSch.setConfig("StrictHostKeyChecking", "no");
            session = ssh.getSession(userName, host, port);
            session.setPassword(password);
            session.connect();
            channel = session.openChannel("sftp");
            channel.connect();
            ChannelSftp sftp = (ChannelSftp) channel;
            sftp.get(path, "specify path to where you want the files to be output");
        } catch (JSchException e) {
            System.out.println(userName);
            e.printStackTrace();


        } catch (SftpException e) {
            System.out.println(userName);
            e.printStackTrace();
        } finally {
            if (channel != null) {
                channel.disconnect();
            }
            if (session != null) {
                session.disconnect();
            }
        }

    }

JSch est une bibliothèque agréable à utiliser. La réponse à votre question est assez simple.

JSch jsch=new JSch();
  Session session=jsch.getSession(user, host, 22);
  session.setPassword("password");


  Properties config = new Properties();
  config.put("StrictHostKeyChecking","no");
  session.setConfig(config);
  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);
    }
  }

Vous pouvez trouver le code complet à

http: //faisalbhagat.blogspot. com / 2013/09 / java-uploading-file-remote-via-scp.html

Je dois copier le dossier de manière récursive, après avoir essayé différentes solutions, pour terminer par ProcessBuilder + expect / spawn

scpFile("192.168.1.1", "root","password","/tmp/1","/tmp");

public void scpFile(String host, String username, String password, String src, String dest) throws Exception {

    String[] scpCmd = new String[]{"expect", "-c", String.format("spawn scp -r %s %s@%s:%s\n", src, username, host, dest)  +
            "expect \"?assword:\"\n" +
            String.format("send \"%s\\r\"\n", password) +
            "expect eof"};

    ProcessBuilder pb = new ProcessBuilder(scpCmd);
    System.out.println("Run shell command: " + Arrays.toString(scpCmd));
    Process process = pb.start();
    int errCode = process.waitFor();
    System.out.println("Echo command executed, any errors? " + (errCode == 0 ? "No" : "Yes"));
    System.out.println("Echo Output:\n" + output(process.getInputStream()));
    if(errCode != 0) throw new Exception();
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top