【问题标题】:JSCH: No such file errorJSCH:没有这样的文件错误
【发布时间】:2021-07-10 08:08:23
【问题描述】:

我有运行 ssh 服务器的 windows 机器。我知道那台机器上的路径。让它成为D:/Folder1/Folder2。我正在使用 JSCH 创建 sftp 通道。但是当我尝试 cd 到 D:/Folder1/Folder2 时,会抛出 "No such file: 2" 错误。

有人可以帮忙吗?我可能需要转换路径吗?

【问题讨论】:

  • 什么 Windows SSH 服务器?你试过不使用 JSCH(使用 sftp 程序)吗?
  • 那么 Cygwin ssh 服务器使用 Cygwin 路径不是吗?喜欢 /cygdrive/d/folder1/folder2
  • 我试过winscp。执行 cd D:/Folder1/Folder2。它没有任何问题。
  • 我在 JSCH 源代码中发现了问题。看起来有些服务器无法处理正确的真实路径。 _realpath 函数中的问题。函数抛出状态码而不是返回路径的字节数组
  • 在Linux上遇到这个错误,我们错误地使用了绝对路径(以/开头);将其切换到相对路径(剥离前导 /)使错误消失。

标签: java ssh jsch


【解决方案1】:

问题是路径。它没有找到要重命名的文件,如果您使用的是 JSCH 库,您可以使用 channelSftp.pwd() 了解当前位置。

例子:

Sftp sftp = new Sftp();
sftp.conectar();
ChannelSftp channelSftp = sftp.getChannelSftp();
channelSftp.rename(channelSftp.pwd()+"//"+file,`channelSftp.pwd()`+"//"+"new_dir//"+file);
//or
String url = channelSftp.pwd();
String url_m = channelSftp.pwd()+"/"+directory; 
channelSftp.rename(url+file,url_m+file)



 

【讨论】:

    【解决方案2】:

    我通过打开 exec 通道使用 ChannelExec 解决了这个问题。这对我有用。希望也适用于其他人。

        ...
        java.util.Properties config = new java.util.Properties();
        config.put("StrictHostKeyChecking", "no");
    
        JSch ssh = new JSch();
        session = ssh.getSession(sshSolrUsername, sshSolrHost, 22);
        session.setConfig(config);
        session.setPassword(sshSolrPassword);
        session.connect();
        channel = session.openChannel("exec");        
        ((ChannelExec)channel ).setCommand("cd " + sourcePath);     
        exec.setInputStream(null);
        ((ChannelExec)channel ).setErrStream(System.err);
        InputStream in = channel .getInputStream();
        channel .connect();
        int status = checkStatus(channel , in);
        channel.disconnect();
        ...
    

    【讨论】:

    • 好吧,你打开shell,执行cd并断开连接。重点是什么?从您的问题来看,您似乎想使用 SFTP。
    • 是的,你是对的。我正在使用通道来执行其他命令。我刚刚编辑了一段代码。
    【解决方案3】:

    我建议你在inpuStream中读取你的文件,然后使用函数:

            put(InputStream src, String dst)
    

    文档:https://epaul.github.io/jsch-documentation/simple.javadoc/com/jcraft/jsch/ChannelSftp.html

    例子:

            String fileName = "D:/Folder1/Folder2";
            File initialFile = new File(fileName);
            InputStream targetStream = new FileInputStream(initialFile);
            channelSftp.put(targetStream, "./in/");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 2013-11-04
      • 2012-02-18
      相关资源
      最近更新 更多