How to retrieve a file from a server via SFTP?

后端 未结 16 1342
萌比男神i
萌比男神i 2020-11-22 07:48

I\'m trying to retrieve a file from a server using SFTP (as opposed to FTPS) using Java. How can I do this?

相关标签:
16条回答
  • 2020-11-22 08:33

    A nice abstraction on top of Jsch is Apache commons-vfs which offers a virtual filesystem API that makes accessing and writing SFTP files almost transparent. Worked well for us.

    0 讨论(0)
  • 2020-11-22 08:37

    This was the solution I came up with http://sourceforge.net/projects/sshtools/ (most error handling omitted for clarity). This is an excerpt from my blog

    SshClient ssh = new SshClient();
    ssh.connect(host, port);
    //Authenticate
    PasswordAuthenticationClient passwordAuthenticationClient = new PasswordAuthenticationClient();
    passwordAuthenticationClient.setUsername(userName);
    passwordAuthenticationClient.setPassword(password);
    int result = ssh.authenticate(passwordAuthenticationClient);
    if(result != AuthenticationProtocolState.COMPLETE){
         throw new SFTPException("Login to " + host + ":" + port + " " + userName + "/" + password + " failed");
    }
    //Open the SFTP channel
    SftpClient client = ssh.openSftpClient();
    //Send the file
    client.put(filePath);
    //disconnect
    client.quit();
    ssh.disconnect();
    
    0 讨论(0)
  • 2020-11-22 08:39

    JSch library is the powerful library that can be used to read file from SFTP server. Below is the tested code to read file from SFTP location line by line

    JSch jsch = new JSch();
            Session session = null;
            try {
                session = jsch.getSession("user", "127.0.0.1", 22);
                session.setConfig("StrictHostKeyChecking", "no");
                session.setPassword("password");
                session.connect();
    
                Channel channel = session.openChannel("sftp");
                channel.connect();
                ChannelSftp sftpChannel = (ChannelSftp) channel;
    
                InputStream stream = sftpChannel.get("/usr/home/testfile.txt");
                try {
                    BufferedReader br = new BufferedReader(new InputStreamReader(stream));
                    String line;
                    while ((line = br.readLine()) != null) {
                        System.out.println(line);
                    }
    
                } catch (IOException io) {
                    System.out.println("Exception occurred during reading file from SFTP server due to " + io.getMessage());
                    io.getMessage();
    
                } catch (Exception e) {
                    System.out.println("Exception occurred during reading file from SFTP server due to " + e.getMessage());
                    e.getMessage();
    
                }
    
                sftpChannel.exit();
                session.disconnect();
            } catch (JSchException e) {
                e.printStackTrace();
            } catch (SftpException e) {
                e.printStackTrace();
            }
    

    Please refer the blog for whole program.

    0 讨论(0)
  • 2020-11-22 08:40

    hierynomus/sshj has a complete implementation of SFTP version 3 (what OpenSSH implements)

    Example code from SFTPUpload.java

    package net.schmizz.sshj.examples;
    
    import net.schmizz.sshj.SSHClient;
    import net.schmizz.sshj.sftp.SFTPClient;
    import net.schmizz.sshj.xfer.FileSystemFile;
    
    import java.io.File;
    import java.io.IOException;
    
    /** This example demonstrates uploading of a file over SFTP to the SSH server. */
    public class SFTPUpload {
    
        public static void main(String[] args)
                throws IOException {
            final SSHClient ssh = new SSHClient();
            ssh.loadKnownHosts();
            ssh.connect("localhost");
            try {
                ssh.authPublickey(System.getProperty("user.name"));
                final String src = System.getProperty("user.home") + File.separator + "test_file";
                final SFTPClient sftp = ssh.newSFTPClient();
                try {
                    sftp.put(new FileSystemFile(src), "/tmp");
                } finally {
                    sftp.close();
                }
            } finally {
                ssh.disconnect();
            }
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题