scp via java

前端 未结 15 797
粉色の甜心
粉色の甜心 2020-11-27 13:06

What is the best method of performing an scp transfer via the Java programming language? It seems I may be able to perform this via JSSE, JSch or the bouncy castle java libr

相关标签:
15条回答
  • 2020-11-27 14:00

    Here is an example to upload a file using 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 讨论(0)
  • 2020-11-27 14:01

    JSch is a nice library to work with. It has quite an easy answer for your question.

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

    You can find complete code at

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

    0 讨论(0)
  • 2020-11-27 14:01

    I wrote an scp server which is much easier than others. I use Apache MINA project (Apache SSHD) to develop it. You can take a look here: https://github.com/boomz/JSCP Also you can download the jar file from /jar directory. How to use? Take a look on: https://github.com/boomz/JSCP/blob/master/src/Main.java

    0 讨论(0)
提交回复
热议问题