SSH provides support for secure remote login(login to remote server similar to putty), secure file transfer(SCP or FTP/SFTP download), and secure TCP/IP and X11 forwardings. JSch is a Java implementation of SSH2 protocal.
In this example we will see how we can use JSch library to login to SFTP server and download files.
First, add the following dependency to your pom.xml
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version> <!-- or latest version -->
</dependency> JSch apis are pretty simple. First you create a session and open a channel then you can use one of the many function such as CD, LS, PUT, GET to change directory, list content, upload file or download respectively.
JSch jsch = new JSch();
Session session = jsch.getSession("demo", "test.rebex.net", 22);
session.setPassword("password");
session.connect();
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
channelSftp.cd("/a/folder");
Vector<ChannelSftp.LsEntry> entries = channelSftp.ls(folder);channelSftp.get(String fileNameInFtp, String destinationFile);
channelSftp. put(String src, String dst) //default is overwrite
channelSftp. put(String src, String dst, int mode)
Upload Modes:
public static final int OVERWRITE=0;
public static final int RESUME=1;
public static final int APPEND=2;
In this example, we are using a publicly available ftp server as described in https://test.rebex.net/
import com.jcraft.jsch.*;
import java.io.File;
import java.util.*;
public class JschDownload {
public static void main(String[] args) {
Session session = null;
ChannelSftp channel = null;
try {
JSch jsch = new JSch();
session = jsch.getSession("demo", "test.rebex.net", 22);
session.setPassword("password");
//to prevent following exception for sftp
//com.jcraft.jsch.JSchException: UnknownHostKey: test.rebex.net. RSA key fingerprint is ..
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
System.out.println("session connected");
//various channels are supported eg: shell, x11,
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
System.out.println("channel connected");
downloadFromFolder(channel, "/");
downloadFromFolder(channel, "/pub/example/");
//in order to download all files including sub-folders/sub-sub-folder, we should iterate recursively
System.out.println("File Uploaded to FTP Server Successfully.");
} catch (Exception e) {
e.printStackTrace();
} finally {
if (channel != null) {
channel.disconnect();
}
if (channel != null) {
session.disconnect();
}
}
}
static void downloadFromFolder(ChannelSftp channelSftp, String folder) throws SftpException {
Vector<ChannelSftp.LsEntry> entries = channelSftp.ls(folder);
new File("download").mkdir();
//download all files (except the ., .. and folders) from given folder
for (ChannelSftp.LsEntry en : entries) {
if (en.getFilename().equals(".") || en.getFilename().equals("..") || en.getAttrs().isDir()) {
continue;
}
System.out.println("Downloading " + (folder + en.getFilename()) + " ----> " + "download" + File.separator + en.getFilename());
channelSftp.get(folder + en.getFilename(), "download" + File.separator + en.getFilename());
}
}
}