使用 JSch 的权限被拒绝
Permission denied using 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 服务器上,所有权限都授予任何用户。但出于某种原因,它不允许我更改源(远程)服务器中的当前目录。
有什么想法吗?
更新: Sftp 服务器是 freeFTPd 并且使用 sftp 客户端(如 Filezilla)我可以毫无问题地移动文件
可能/user_files
是绝对路径。
尝试 ./user_files
获取用户主目录的相对路径。
在 Filezilla 中,远程端是 C:\user_files
?
我遇到了同样的问题,验证以下内容解决了我的问题:
- 我们尝试检索的文件路径不存在。因此,请确保该文件确实存在于您的应用程序正在访问以检索文件的目录下。
- 确保您在应用程序中用于建立连接的 SFTP 用户已配置并在 SFTP 中处于活动状态。
- 如果以上两点在您的场景中都有效,请在重新启动 SFTP 服务后尝试。
我在 docker 容器中使用 jsch 时也遇到了问题,并在使用文件夹 chowning 并以 root 启动 sftp 后解决了这个问题:
- 使用 root 启动应用程序,而不是其他用户,因为它将使用 root 拥有的目录“/var/run”;
- 因为(1),你应该有一个root拥有的路径作为数据路径,你最好给path:chmod 777 /yourpath;
full privileges
- 注意:当使用 "sftp -P 22 admin@127.0.0.1" 登录 sftp 服务器时,您应该 mkdir,而不是在数据路径中执行,因为该路径将由 root 或其他系统用户拥有,而不是您的 sftp 系统中的用户, 这样你就不能上传文件了(因为权限被拒绝);
- 以上都改完后,终于可以在服务器上传下载文件了
我也遇到过同样的情况。它通过仅在服务器上添加路由来解决。例子
例子
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
channel.cd("/path_directory");
我正在尝试使用 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)我可以毫无问题地移动文件
可能/user_files
是绝对路径。
尝试 ./user_files
获取用户主目录的相对路径。
在 Filezilla 中,远程端是 C:\user_files
?
我遇到了同样的问题,验证以下内容解决了我的问题:
- 我们尝试检索的文件路径不存在。因此,请确保该文件确实存在于您的应用程序正在访问以检索文件的目录下。
- 确保您在应用程序中用于建立连接的 SFTP 用户已配置并在 SFTP 中处于活动状态。
- 如果以上两点在您的场景中都有效,请在重新启动 SFTP 服务后尝试。
我在 docker 容器中使用 jsch 时也遇到了问题,并在使用文件夹 chowning 并以 root 启动 sftp 后解决了这个问题:
- 使用 root 启动应用程序,而不是其他用户,因为它将使用 root 拥有的目录“/var/run”;
- 因为(1),你应该有一个root拥有的路径作为数据路径,你最好给path:chmod 777 /yourpath; full privileges
- 注意:当使用 "sftp -P 22 admin@127.0.0.1" 登录 sftp 服务器时,您应该 mkdir,而不是在数据路径中执行,因为该路径将由 root 或其他系统用户拥有,而不是您的 sftp 系统中的用户, 这样你就不能上传文件了(因为权限被拒绝);
- 以上都改完后,终于可以在服务器上传下载文件了
我也遇到过同样的情况。它通过仅在服务器上添加路由来解决。例子
例子
ChannelSftp channel = (ChannelSftp) session.openChannel("sftp");
channel.connect();
channel.cd("/path_directory");