sftp - JSCH (SFTP) 在子文件夹级别(第二级别)更改目录时失败

标签 sftp jsch

当前一个目录不在根目录(ftp home)中时,JSch 的 SFTP channel 无法更改目录。它仅发生在某些 SFTP 服务器上,而不是所有服务器上。

例如目录结构是这样的:

  • /
    • 1 级
      • 2 级

cd level-1(确定)
cd level-2(失败)

它会抛出这样的异常

4: Folder not found: /level-1/level-2
    at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2569)
    at com.jcraft.jsch.ChannelSftp._realpath(ChannelSftp.java:2100)
    at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:315)

出现错误的 SFTP 服务器返回 / 作为根目录的真实路径。没有失败的另一台服务器返回完整路径列表 /usr/account

最佳答案

我找到了 JSCH 0.1.49 的源代码并追踪了它。我发现有一个名为 _realPath 的方法,当服务器无法返回真实路径时会抛出异常。 该方法的输入参数是远程文件夹的绝对路径,因此我注释掉了异常并返回了绝对路径。一切正常。

这是修改后的代码。请注意,原始代码在大多数情况下都有效,我所做的更改是针对极少数情况,即服务器无法返回二级目录(子文件夹)上的真实路径,并且不能保证它适用于所有服务器。

//com.jcraft.jsch.ChannelSftp
private byte[] _realpath(String path) throws ... {
...
if (type == SSH_FXP_STATUS) {
  i = buf.getInt();
  /* Some servers fail to return the realPath
   on second level of directory (subfolders).
   original code is commented out and replaced with a return.*/
  //throwStatusError(buf, i);
  return (path.getBytes());
}
...

关于sftp - JSCH (SFTP) 在子文件夹级别(第二级别)更改目录时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072175/

相关文章:

java - 使用 Java 在 WinSCP 中将文件从本地计算机传输到服务器

java - JSch ChannelSftp 退出状态始终为 -1

带有私钥身份验证的 SFTP 的 cURL

shell - 无法使用 Expect 脚本创建文件夹

python - Python Paramiko 中的密码验证失败,但相同的凭据在 SSH/SFTP 客户端中有效

java - 如何将注册表中的 putty 已知主机条目转换为 Jsch 可读的已知主机文件

c# - 如何在 C# 中编程与 filezilla 集成。[sftp]

shell - 命令行 sftp : email address as username

java - 直接将 SFTP 文件下载到远程服务器文件夹(而不是共享路径)

scala - 当我在 Scala 代码中使用它时,无法从 Jsch 导入 ChannelSftp.LsEntry,为什么?