Frage

Was ist die beste Methode, über den Java-Programmiersprache eine scp Übertragung der Durchführung? Es scheint, dass ich in der Lage sein dies über JSSE, JSch oder die Hüpfburg Java-Bibliotheken durchzuführen. Keine dieser Lösungen scheint eine einfache Antwort zu haben.

War es hilfreich?

Lösung

Ich landete mit JSch - es war ziemlich einfach, und schien ziemlich gut zu skalieren ( ich war ein paar tausend Dateien alle paar Minuten) greifen.

Andere Tipps

Stecker: sshj ist die einzige vernünftige Wahl! Sehen Sie diese Beispiele zu beginnen: Download , Upload .

Hier finden Sie aktuelle hier

Das ist der Quellcode für Ameisen SCP Aufgabe. Der Code in dem „execute“ Verfahren ist, wo die Schrauben und Muttern davon sind. Dies sollten Sie eine Vorstellung von dem, was erforderlich ist. Es verwendet JSch ich glaube.

Alternativ können Sie auch direkt ausführen diesen Ant-Task aus Ihrem Java-Code.

Ich wickelte JSch mit einigen Hilfsmethoden es etwas freundlicher zu machen und nannte es

Jscp

Erhältlich hier: https://github.com/willwarren/jscp

SCP-Dienstprogramm einen Ordner TAR, ZIP es, und scp es irgendwo, dann entpacken Sie es.

Verbrauch:

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

enthält auch nützliche Klassen -. Scp und Exec und ein TarAndGzip, die in so ziemlich die gleiche Weise arbeiten

Dies ist High-Level-Lösung , keine Notwendigkeit, neu zu erfinden. Schnell und schmutzig!

1) Gehen Sie zunächst auf http: //ant.apache. org / bindownload.cgi und neuesten Apache Ant binären herunterladen. (Heute, apache-ant-1.9.4-bin.zip).

2) , um die heruntergeladene Datei extrahiert und finden Sie die JAR- ant-jsch.jar ( "Apache-ant-1.9.4 / lib / ant-jsch.jar" ). Fügen Sie diese JAR in Ihrem Projekt . Auch Ameisen launcher.jar und ant.jar.

3) Zum Jcraft jsch SouceForge Projekt und laden Sie das Glas. Heutzutage jsch-0.1. 52.jar . Auch Fügen Sie diese JAR in Ihrem Projekt .

Jetzt können Sie easyly in Java-Code verwenden, um die Ant Klassen Scp für Kopieren von Dateien über das Netzwerk oder SSHExec für Befehle in SSH-Servern.

4) Code-Beispiel 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();

Der OpenSSH Projekt mehr Java Alternativen aufzeigt, Trilead SSH für Java scheint zu passen, was Sie fordern.

Ich verwende diesen SFTP-API, die SCP Zehon hat genannt, es ist toll, so einfach mit einer Menge von Beispielcode zu verwenden. Hier ist die Website http://www.zehon.com

schaute ich auf viele dieser Lösungen und nicht wie viele von ihnen. Vor allem, weil der lästigen Schritt Ihre bekannten Hosts identifizieren zu müssen. Das und JSch auf einem unglaublich niedrigen Niveau relativ zu dem SCP-Befehl.

fand ich eine Bibliothek, die dies nicht erforderlich ist, aber es ist gebündelt und als Kommandozeilen-Tool verwendet. https://code.google.com/p/scp-java-client/

Ich schaute durch den Quellcode und entdecken, wie es zu verwenden, ohne die Befehlszeile. Hier ist ein Beispiel für das Hochladen:

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

Der größte Nachteil ist, dass es nicht in einer Maven-Repo ist (das ich finden kann). Aber die einfache Bedienung es mir wert.

Wie einige hier, landete ich einen Wrapper zu schreiben um die JSch Bibliothek.

Es heißt way-secshell und es ist auf 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();

Ich schrieb einen scp Server, der viel einfacher als andere. Ich benutze Apache MINA Projekt (Apache SSHD) zu entwickeln. Sie können hier einen Blick: https://github.com/boomz/JSCP Auch können Sie die JAR-Datei aus /jar Verzeichnis herunterladen. Wie benutzt man? Werfen Sie einen Blick auf: https://github.com/boomz/JSCP/ Blob / Master / src / Main.java

JSch hat für mich große gearbeitet. Unten ist ein Beispiel für ein Verfahren, das Server und Download-SFTP-Dateien angegebenen Verzeichnis verbinden wird. Es ist weg StrictHostKeyChecking von Deaktivierung zu bleiben empfohlen. Obwohl ein wenig schwieriger einzurichten, aus Sicherheitsgründen die bekannten Hosts spezifizieren sollte die Norm sein.

jsch.setKnownHosts ( "C: \ Benutzer \ test \ known_hosts"); empfohlen

JSch.setConfig ( "StrictHostKeyChecking", "nein"); - nicht empfohlen

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 ist eine schöne Bibliothek zu arbeiten. Es hat durchaus eine einfache Antwort auf Ihre Frage.

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

Hier finden Sie vollständigen Code in

http: //faisalbhagat.blogspot. com / 2013/09 / java-Upload-Datei-remote-via-scp.html

Ich brauche Ordner rekursiv zu kopieren, nachdem verschiedene Lösungen versucht, schließlich durch Process am Ende + erwarten / Laich

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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top