How to retrieve a file from a server via SFTP?
Another option is to consider looking at the JSch library. JSch seems to be the preferred library for a few large open source projects, including Eclipse, Ant and Apache Commons HttpClient, amongst others.
It supports both user/pass and certificate-based logins nicely, as well as all a whole host of other yummy SSH2 features.
Here's a simple remote file retrieve over SFTP. Error handling is left as an exercise for the reader :-)
JSch jsch = new JSch();String knownHostsFilename = "/home/username/.ssh/known_hosts";jsch.setKnownHosts( knownHostsFilename );Session session = jsch.getSession( "remote-username", "remote-host" ); { // "interactive" version // can selectively update specified known_hosts file // need to implement UserInfo interface // MyUserInfo is a swing implementation provided in // examples/Sftp.java in the JSch dist UserInfo ui = new MyUserInfo(); session.setUserInfo(ui); // OR non-interactive version. Relies in host key being in known-hosts file session.setPassword( "remote-password" );}session.connect();Channel channel = session.openChannel( "sftp" );channel.connect();ChannelSftp sftpChannel = (ChannelSftp) channel;sftpChannel.get("remote-file", "local-file" );// ORInputStream in = sftpChannel.get( "remote-file" ); // process inputstream as neededsftpChannel.exit();session.disconnect();
Here is the complete source code of an example using JSch without having to worry about the ssh key checking.
import com.jcraft.jsch.*;public class TestJSch { public static void main(String args[]) { JSch jsch = new JSch(); Session session = null; try { session = jsch.getSession("username", "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; sftpChannel.get("remotefile.txt", "localfile.txt"); sftpChannel.exit(); session.disconnect(); } catch (JSchException e) { e.printStackTrace(); } catch (SftpException e) { e.printStackTrace(); } }}
Below is an example using Apache Common VFS:
FileSystemOptions fsOptions = new FileSystemOptions();SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fsOptions, "no");FileSystemManager fsManager = VFS.getManager();String uri = "sftp://user:password@host:port/absolute-path";FileObject fo = fsManager.resolveFile(uri, fsOptions);