使用JSch出现权限被拒绝的情况。

4

我正在尝试使用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服务器上,并且已经授予了所有用户权限。但由于某种原因,我无法更改源(远程)服务器的当前目录。

有什么想法吗?

更新:Sftp服务器是freeFTPd,使用sftp客户端(例如Filezilla)可以轻松移动文件。

5个回答

4

可能/user_files是一个绝对路径。

尝试使用./user_files作为用户主目录的相对路径。

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


文件夹 user_files 不在远程端。它试图访问一个不存在的文件夹。谢谢! - Iván Travecedo
如果我尝试使用/user_files而不是./user_files会怎样? - Memphis Meng

1
我在使用docker容器中的jsch时也遇到了问题,通过将文件夹所有权设置为root并以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. 在完成上述所有更改后,我最终可以在服务器上上传和下载文件。

0

我也遇到了同样的问题,验证以下内容可以解决我的问题:

  1. 我们尝试检索的文件路径不存在。因此,请确保该文件实际存在于应用程序正在访问以检索文件的目录下。
  2. 确保在应用程序中使用的 SFTP 用户已在 SFTP 中配置并处于活动状态。
  3. 如果您的情况满足上述两点,则尝试重新启动 SFTP 服务后再试。

-1

我也遇到了同样的问题。只需在服务器上添加路由即可解决。示例

示例

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

-1

假设您正在连接到C:/user_files/, 尝试读取/复制所有文件

确保C:/user_files/上不存在子文件夹 如果存在文件夹,则需要使用文件夹读取采用不同的方法。 希望这可以帮助...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接