使用JSch

时间:2015-10-20 17:40:21

标签: java sftp jsch

我尝试使用JSch从sftp服务器检索一些文件,但我收到以下错误。

3: Permission denied
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
at com.jcraft.jsch.ChannelSftp._realpath(ChannelSftp.java:2340)
at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:342)
at com.company.common.sftp.impl.managedFile.moveFiles(managedFile.java:712)

以下是代码:

private List<String> moveFiles(String prefixFileName, String path) {
    Session session = getSession();
    Channel channel = connect(session);
    ChannelSftp channelSftp = null;
    try {
        channelSftp = (ChannelSftp)channel;
        channelSftp.cd(_workingDir);
    ...
    }
    ...
    finally {
        channel.disconnect();
        session.disconnect();
    }
}

public Session getSession() {              
    Session session = null;
    JSch jsch = new JSch();
    session = jsch.getSession(_user,_server,_port);
    session.setPassword(_password);
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", _strictHostKeyChecking);
    session.setConfig(config);
    session.connect();
    return session;
 }

public static Channel connect(Session session) {
  Channel channel = null;
  channel = session.openChannel("sftp");
  channel.connect();
  return channel;
}

_workingDir是具有以下值的属性:/user_files。 两个文件夹(源和目标)都在Windows服务器上,并且所有权限都授予任何用户。但由于某种原因,它不允许我更改源(远程)服务器中的当前目录。

有什么想法吗?

UPDATE: Sftp服务器是freeFTPd并使用sftp客户端(如Filezilla)我可以毫无问题地移动文件

3 个答案:

答案 0 :(得分:2)

可能/user_files是绝对路径。

尝试./user_files获取用户主目录的相对路径。

在Filezilla中,远程端是C:\user_files吗?

答案 1 :(得分:0)

我遇到了同样的问题,并且验证以下问题解决了我的问题:

  1. 我们尝试检索的文件路径不存在。因此,请确保该文件实际存在于您的应用程序正在访问的目录下以检索该文件。
  2. 确保在SFTP中配置并激活应用程序中用于建立连接的SFTP用户。
  3. 如果以上两点在您的方案中有效,请在重新启动SFTP服务后尝试。

答案 2 :(得分:0)

在docker容器中使用jsch时,我也遇到了问题,并在将文件夹固定好并以root启动sftp之后解决了该问题:

  1. 使用root而不是其他用户启动应用程序,因为它将与root拥有的目录“ / var / run”一起使用;
  2. 由于(1),您应该拥有root拥有的路径作为数据路径,因此最好为该路径赋予完全特权:chmod 777 / yourpath;
  3. 提示:使用“ sftp -P 22 admin@127.0.0.1”登录sftp服务器时,应使用mkdir,而不是在数据路径中执行此操作,因为该路径将由root或其他系统用户拥有,但不属于该用户在您的sftp系统中,这样您就不能上传文件(因为权限被拒绝);
  4. 完成上述所有操作后,我终于可以在服务器上上传和下载文件了。