Domanda

Qual è il metodo migliore per eseguire un trasferimento scp tramite il linguaggio di programmazione Java? Sembra che potrei essere in grado di eseguire questo tramite JSSE, JSch o le librerie java del castello gonfiabile. Nessuna di queste soluzioni sembra avere una risposta facile.

È stato utile?

Soluzione

Ho finito con l'utilizzo di Jsch : era piuttosto semplice e sembrava ridimensionarsi abbastanza bene ( Stavo raccogliendo alcune migliaia di file ogni pochi minuti).

Altri suggerimenti

plug: sshj è l'unica scelta sana! Guarda questi esempi per iniziare: download , upload .

Dai un'occhiata qui

Questo è il codice sorgente dell'attività SCP di Ants. Il codice in " esegui " il metodo è dove sono i dadi e le viti. Questo dovrebbe darti una buona idea di ciò che è richiesto. Usa JSch credo.

In alternativa puoi anche eseguire direttamente questa attività Ant dal tuo codice java.

Ho avvolto Jsch con alcuni metodi di utilità per renderlo un po 'più amichevole e l'ho chiamato

Jscp

Disponibile qui: https://github.com/willwarren/jscp

Utilità SCP per tarare una cartella, comprimerla e scp da qualche parte, quindi decomprimerla.

Utilizzo:

// 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") 
           );

Include anche utili classi: Scp ed Exec e TarAndGzip, che funzionano praticamente allo stesso modo.

Questa è soluzione di alto livello , non è necessario reinventarla. Veloce e sporco!

1) Innanzitutto, vai a http: //ant.apache. org / bindownload.cgi e scarica l'ultimo binario di Apache Ant. (al giorno d'oggi, apache-ant-1.9.4-bin.zip).

2) Estrai il file scaricato e trova il JAR ant-jsch.jar (" apache-ant-1.9.4 / lib / ant-jsch.jar " ;). Aggiungi questo JAR nel tuo progetto . Anche ant-launcher.jar e ant.jar.

3) Vai a Progetto Jcraft jsch SouceForge e scarica il vaso. Oggigiorno, jsch-0.1. 52.jar . Inoltre Aggiungi questo JAR nel tuo progetto .

Ora, puoi facilmente usare nel codice java le Classi di formiche Scp per copiare file in rete o SSHExec per i comandi nei server SSH.

4) Esempio di codice 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();

Il progetto openssh elenca diverse alternative Java, Trilead SSH per Java sembra adattarsi a ciò che stai chiedendo.

Uso questa API SFTP che ha SCP chiamato Zehon, è eccezionale, così facile da usare con un sacco di codice di esempio. Ecco il sito http://www.zehon.com

Ho esaminato molte di queste soluzioni e non mi sono piaciute molte. Soprattutto perché il fastidioso passaggio di dover identificare i tuoi host conosciuti. Quello e JSCH sono a un livello ridicolmente basso rispetto al comando scp.

Ho trovato una libreria che non lo richiede ma è raggruppata e utilizzata come strumento da riga di comando. https://code.google.com/p/scp-java-client/

Ho cercato il codice sorgente e ho scoperto come usarlo senza la riga di comando. Ecco un esempio di caricamento:

    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();

Il più grande svantaggio è che non si trova in un repository maven (che ho potuto trovare). Ma la facilità d'uso è valsa la pena per me.

Come alcuni qui, ho finito per scrivere un wrapper attorno alla libreria JSch.

Si chiama way-secshell ed è ospitato su 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();

Ho scritto un server SCP che è molto più semplice di altri. Uso il progetto Apache MINA (Apache SSHD) per svilupparlo. Puoi dare un'occhiata qui: https://github.com/boomz/JSCP Inoltre puoi scaricare il file jar dalla directory / jar . Come usare? Dai un'occhiata a: https://github.com/boomz/JSCP/ blob / master / src / Main.java

jsCH ha funzionato benissimo per me. Di seguito è riportato un esempio di un metodo che si connetterà al server sftp e scaricherà i file nella directory specificata. Si consiglia di evitare la disabilitazione di StrictHostKeyChecking. Sebbene sia un po 'più difficile da configurare, per motivi di sicurezza specificare gli host conosciuti dovrebbe essere la norma.

jsch.setKnownHosts (" C: \ Users \ test \ known_hosts "); consigliato

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

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 è una bella libreria con cui lavorare. Ha una risposta abbastanza semplice per la tua domanda.

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);
    }
  }

Puoi trovare il codice completo su

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

Devo copiare la cartella in modo ricorsivo, dopo aver provato diverse soluzioni, alla fine finiscono con ProcessBuilder + prevedono / 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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top