it-swarm.com.de

scp via java

Was ist die beste Methode, um eine SCP-Übertragung über die Programmiersprache Java durchzuführen? Möglicherweise kann ich dies über JSSE, JSch oder die Hüpfburg-Bibliotheken Java ausführen. Keine dieser Lösungen scheint eine einfache Antwort zu haben.

73
Lloyd Meinholz

Am Ende benutzte ich Jsch - es war ziemlich unkompliziert und schien ziemlich gut zu skalieren (ich habe alle paar Minuten ein paar tausend Dateien gepackt).

52
Tim Howland

plug: sshj ist die einzig vernünftige wahl! Sehen Sie sich die folgenden Beispiele an, um zu beginnen: Download , pload .

20
shikhar

Schau mal hier

Das ist der Quellcode für die SCP-Aufgabe von Ants. Der Code in der "execute" -Methode befindet sich dort, wo sich die Muttern und Schrauben befinden. Dies sollte Ihnen eine gute Vorstellung davon geben, was erforderlich ist. Ich glaube, es benutzt JSch.

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

16
abarax

Ich habe Jsch mit einigen Utility-Methoden verpackt, um es ein bisschen freundlicher zu machen, und habe es genannt

Jscp

Verfügbar hier: https://github.com/willwarren/jscp

SCP-Dienstprogramm zum Tarieren eines Ordners, zum Komprimieren und zum Scannen und anschließenden Entpacken.

Verwendung:

// 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, sowie einen TarAndGzip, die auf die gleiche Weise funktionieren.

6
Will

Dies ist eine High-Level-Lösung , die nicht neu erfunden werden muss. Schnell und dreckig!

1) Gehen Sie zunächst zu http://ant.Apache.org/bindownload.cgi und laden Sie die neueste Apache Ant-Binärdatei herunter . (Heutzutage Apache-ant-1.9.4-bin.Zip).

2) Extrahieren Sie die heruntergeladene Datei und suchen Sie die JAR ant-jsch.jar ("Apache-ant-1.9.4/lib/ant-jsch.jar"). Fügen Sie diese JAR in Ihr Projekt ein . Auch ant-launcher.jar und ant.jar.

3) Gehe zu Jcraft jsch SouceForge Project und lade das Glas herunter. Heutzutage jsch-0.1.52.jar . Auch Fügen Sie diese JAR in Ihr Projekt ein .

Jetzt können Sie einfach in Java den Code der Ant Classes Scp zum Kopieren von Dateien über das Netzwerk oder SSHExec für Befehle in SSH-Servern.

4) Codebeispiel 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();
4
Fernando Santos

Das openssh-Projekt listet mehrere Java Alternativen, Trilead SSH für Java scheint zu dem zu passen, wonach Sie fragen.

3
Kyle Burton

Ich habe mir viele dieser Lösungen angesehen und viele davon nicht gemocht. Vor allem, weil Sie Ihre bekannten Hosts nur ärgerlich identifizieren müssen. Das und JSCH ist in Bezug auf den Befehl scp auf einem lächerlich niedrigen Niveau.

Ich habe eine Bibliothek gefunden, für die dies nicht erforderlich ist, die jedoch gebündelt und als Befehlszeilentool verwendet wird. https://code.google.com/p/scp-Java-client/

Ich habe den Quellcode durchgesehen und herausgefunden, wie man ihn ohne die Kommandozeile benutzt. 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("[email protected]:/path/on/remote");
    scp.execute();

Der größte Nachteil ist, dass es sich nicht um ein Maven-Repo handelt (das ich finden konnte). Aber die Benutzerfreundlichkeit ist es mir wert.

2
Daniel Kaplan

Ich verwende diese SFTP-API mit dem SCP Zehon. Sie ist großartig und mit viel Beispielcode einfach zu verwenden. Hier ist die Seite http://www.zehon.com

2
bigjavageek

Wie einige hier habe ich einen Wrapper um die JSch-Bibliothek geschrieben.

Es heißt way-secshell und wird auf GitHub gehostet:

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

JSch ist eine nette Bibliothek, mit der man arbeiten kann. Es hat eine recht 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);
    }
  }

Den vollständigen Code finden Sie unter

http://faisalbhagat.blogspot.com/2013/09/Java-uploading-file-remotely-via-scp.html

0
faisalbhagat

Hier ist ein Beispiel zum Hochladen einer Datei mit JSch :

ScpUploader.Java:

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

import Java.io.ByteArrayInputStream;
import Java.util.Properties;

public final class ScpUploader
{
    public static ScpUploader newInstance()
    {
        return new ScpUploader();
    }

    private volatile Session session;
    private volatile ChannelSftp channel;

    private ScpUploader(){}

    public synchronized void connect(String Host, int port, String username, String password) throws JSchException
    {
        JSch jsch = new JSch();

        Properties config = new Properties();
        config.put("StrictHostKeyChecking", "no");

        session = jsch.getSession(username, Host, port);
        session.setPassword(password);
        session.setConfig(config);
        session.setInputStream(System.in);
        session.connect();

        channel = (ChannelSftp) session.openChannel("sftp");
        channel.connect();
    }

    public synchronized void uploadFile(String directoryPath, String fileName, byte[] fileBytes, boolean overwrite) throws SftpException
    {
        if(session == null || channel == null)
        {
            System.err.println("No open session!");
            return;
        }

        // a workaround to check if the directory exists. Otherwise, create it
        channel.cd("/");
        String[] directories = directoryPath.split("/");
        for(String directory : directories)
        {
            if(directory.length() > 0)
            {
                try
                {
                    channel.cd(directory);
                }
                catch(SftpException e)
                {
                    // swallowed exception

                    System.out.println("The directory (" + directory + ") seems to be not exist. We will try to create it.");

                    try
                    {
                        channel.mkdir(directory);
                        channel.cd(directory);
                        System.out.println("The directory (" + directory + ") is created successfully!");
                    }
                    catch(SftpException e1)
                    {
                        System.err.println("The directory (" + directory + ") is failed to be created!");
                        e1.printStackTrace();
                        return;
                    }

                }
            }
        }

        channel.put(new ByteArrayInputStream(fileBytes), directoryPath + "/" + fileName, overwrite ? ChannelSftp.OVERWRITE : ChannelSftp.RESUME);
    }

    public synchronized void disconnect()
    {
        if(session == null || channel == null)
        {
            System.err.println("No open session!");
            return;
        }

        channel.exit();
        channel.disconnect();
        session.disconnect();

        channel = null;
        session = null;
    }
}

AppEntryPoint.Java:

import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.SftpException;

import Java.io.IOException;
import Java.nio.file.Files;
import Java.nio.file.Paths;

public final class AppEntryPoint
{
    private static final String Host = "192.168.1.1";
    private static final int PORT = 22;
    private static final String USERNAME = "root";
    private static final String PASSWORD = "root";

    public static void main(String[] args) throws IOException
    {
        ScpUploader scpUploader = ScpUploader.newInstance();

        try
        {
            scpUploader.connect(Host, PORT, USERNAME, PASSWORD);
        }
        catch(JSchException e)
        {
            System.err.println("Failed to connect the server!");
            e.printStackTrace();
            return;
        }

        System.out.println("Successfully connected to the server!");

        byte[] fileBytes = Files.readAllBytes(Paths.get("C:/file.Zip"));

        try
        {
            scpUploader.uploadFile("/test/files", "file.Zip", fileBytes, true); // if overwrite == false, it won't throw exception if the file exists
            System.out.println("Successfully uploaded the file!");
        }
        catch(SftpException e)
        {
            System.err.println("Failed to upload the file!");
            e.printStackTrace();
        }

        scpUploader.disconnect();
    }
}
0
Eng.Fouad

Ich habe einen scp-Server geschrieben, der viel einfacher ist als andere. Ich benutze Apache MINA-Projekt (Apache SSHD), um es zu entwickeln. Hier können Sie einen Blick darauf werfen: https://github.com/boomz/JSCP Außerdem können Sie die JAR-Datei aus dem Verzeichnis /jar Herunterladen. Wie benutzt man? Schauen Sie sich Folgendes an: https://github.com/boomz/JSCP/blob/master/src/Main.Java

0
boomz

jsCH hat großartig für mich gearbeitet. Im Folgenden finden Sie ein Beispiel für eine Methode, mit der eine Verbindung zum SFTP-Server hergestellt und Dateien in das angegebene Verzeichnis heruntergeladen werden. Es wird empfohlen, StrictHostKeyChecking nicht zu deaktivieren. Obwohl die Einrichtung etwas schwieriger ist, sollte es aus Sicherheitsgründen die Regel sein, die bekannten Hosts anzugeben.

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

JSch.setConfig ("StrictHostKeyChecking", "no"); - 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();
            }
        }

    }
0
Eduardo Dennis

Nachdem ich verschiedene Lösungen ausprobiert habe, muss ich den Ordner rekursiv kopieren und erhalte schließlich 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 %[email protected]%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();
}
0
Burt