使用JSch从SFTP服务器检索数据

时间:2011-08-24 19:22:06

标签: java sftp jsch

我正在使用JSch通过SFTP从远程计算机检索文件。这是代码

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

现在,我有两个问题:

  • sftpChannel.get("remote-data.txt");抛出异常:

      

    没有这样的档案
         在com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2297)
         在com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:1750)
         在com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:1020)
         在com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:995)
         在TestSFTPinJava.main(TestSFTPinJava.java:29)

  • 我不确定如何在本地系统中指定保存文件的位置。 sftpChannel.put("C:\\Users\\mona\\Documents\\localCopy.txt");对我来说不合适。

请帮助提出建议,谢谢!

3 个答案:

答案 0 :(得分:6)

关于您的观点1,我怀疑连接后的默认目录不是您所期望的。尝试使用绝对远程路径。 sftpChannel.pwd()是否返回文件remote-data.txt在远程计算机上的目录?

关于第2点,查看http://grepcode.com/file/repo1.maven.org/maven2/com.jcraft/jsch/0.1.42/com/jcraft/jsch/ChannelSftp.java#290,我发现ChannelSftp中存在以下方法:

 public void put(String src, String dst)

确实有源和目标文件名参数。

我猜你已经看过http://www.jcraft.com/jsch/examples/Sftp.java的Jsch sftp示例了吗?

答案 1 :(得分:1)

应用程序的简单示例。 我从远程服务器(从/ tmp / qtmp)获取文件并将其保存在当前路径的本地机器中

package connector;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

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;

public class Fetcher {

    public void fetchFile(String username, String host, String passwd) throws JSchException, SftpException, IOException {
        JSch conn = new JSch();
        Session session = null;
        session = conn.getSession(username, host, 22);
        session.setPassword(passwd);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

        ChannelSftp channel = (ChannelSftp)session.openChannel("sftp");
        channel.connect();

        //change folder on the remote server
        channel.cd("/tmp/qtmp");

        InputStream in = channel.get("testScp");
        // set local file
        String lf = "OBJECT_FILE";
        FileOutputStream tergetFile = new FileOutputStream(lf);

        // read containts of remote file to local
        int c;
        while ( (c= in.read()) != -1 ) {
            tergetFile.write(c);
        } 

        in.close();
        tergetFile.close();

        channel.disconnect();
        session.disconnect();   

    }

}

答案 2 :(得分:0)

我有一个类似的问题,我试图从一切都很好的服务器上获取一些文件,但我总是得到这个错误:

sftpChannel.get("fil1.txt","file1.txt")

error message: 

2: No such file
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2198)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2215)
at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:913)
at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:873)
...

我正在使用

正确列出目录的所有元素
java.util.Vector v1 = sftpChannel.ls(dir);

我认为那让我感到困惑的是,我能够通过使用ls命令读取目录的内容,当你想获取/放置文件时,请确保首先使用“cd”移动。

解决方案是使用下一个命令使用简单的cd命令移动到包含我的文件的目录:

sftpChannel.cd(dir);

希望这会有所帮助,我花了一些时间才弄明白。乔乔。

经验教训:

1.- ls可以读取任何目录,无论你是否在其中。 2.-要获取和放置文件,请始终确保使用cd。

在包含文件的目录中