mona mona - 6 months ago 92
Java Question

Retrieving data from an SFTP server using JSch

I am using JSch for retrieving a file from a remote machine by SFTP. Here is the code

public class TestSFTPinJava {

public static void main(String args[]) {
JSch jsch = new JSch();
Session session = null;
try {
session = jsch.getSession("username", "sftp.abc.com", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("password");
session.connect();

Channel channel = session.openChannel("sftp");
channel.connect();
ChannelSftp sftpChannel = (ChannelSftp) channel;
System.out.println("Directory:" + sftpChannel.pwd());
sftpChannel.cd("remoteDirectory/");
System.out.println("Directory after cd:" + sftpChannel.pwd());
sftpChannel.get("remote-data.txt");

sftpChannel.put("C:\\Users\\mona\\Documents\\local-copy.txt");
sftpChannel.exit();
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
} catch (SftpException e) {
e.printStackTrace();
}
}
}


Now, I have two questions:


  • sftpChannel.get("remote-data.txt");
    throws an exception:


    no such file

    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2297)

    at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:1750)

    at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:1020)

    at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:995)

    at TestSFTPinJava.main(TestSFTPinJava.java:29)

  • I am not sure how to specify the location in my local system where the file will be saved.
    sftpChannel.put("C:\\Users\\mona\\Documents\\localCopy.txt");
    does not look right to me.



Please help with suggestions, Thanks!

Answer

Concerning your point 1, I suspect that the default directory after connecting is not what you expect. Try using an absolute remote path. Does sftpChannel.pwd() return the directory the file remote-data.txt is in on the remote machine ?

Concerning your point 2, looking at http://grepcode.com/file/repo1.maven.org/maven2/com.jcraft/jsch/0.1.42/com/jcraft/jsch/ChannelSftp.java#290 one sees that there is the following method in ChannelSftp:

 public void put(String src, String dst)

which indeed has a source and destination file name argument.

I guess you had already a look the Jsch sftp example at http://www.jcraft.com/jsch/examples/Sftp.java ?

Comments