java 使用JSch拒绝权限

hs1ihplo  于 2022-12-25  发布在  Java
关注(0)|答案(5)|浏览(387)

我试图使用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),我可以毫无问题地移动文件
vu8f3i0k

vu8f3i0k1#

/user_files可能是一个绝对路径。
尝试使用./user_files获取用户主目录的相对路径。
在Filezilla中,远程端是C:\user_files

mklgxw1f

mklgxw1f2#

在Docker容器中使用jsch时我也遇到了这个问题,在使用文件夹chowning并使用root启动sftp后修复了这个问题:
1.使用root用户启动应用程序,而不是其他用户,因为它将使用root用户拥有的目录“/var/run”;
1.由于(1),您应该有一个root拥有的路径作为数据路径,您最好给予该路径完全权限:chmod 777 /yourpath;
1.注意:使用“sftp -P 22 admin@127.0.0.1”登录sftp服务器时,应使用mkdir,而不要在数据路径中使用,因为数据路径将由root或其他系统用户拥有,而不是您的sftp系统中的用户,这样您就无法上传文件(因为权限被拒绝);
1.在更改了以上所有内容后,我终于可以在服务器上上传和下载文件了。

wmtdaxz3

wmtdaxz33#

我也遇到了同样的问题,验证以下内容修复了我的问题:
1.我们尝试检索的文件的路径不存在。因此,请确保该文件确实存在于应用程序正在访问以检索该文件的目录下。
1.确保您在应用程序中用于建立连接的SFTP用户已在SFTP中配置并处于活动状态。
1.如果以上两点在您的场景中都有效,请在重新启动SFTP服务后尝试。

e7arh2l6

e7arh2l64#

同样的事情也发生在我身上。通过只添加服务器上的路由解决了这个问题。示例
示例

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

kkih6yb85#

假设您连接到C:/user_files/尝试读取/复制所有文件
确保C:/user_files/上不存在子文件夹,如果文件夹存在,则需要使用文件夹阅读遵循不同的方法。希望这对您有所帮助...

相关问题