java - 使用 Jsch 将远程服务器上的文件从一个目录复制到另一个目录

标签 java sftp jsch

我正在尝试使用 Jsch 将服务器上的文件从一个目录复制到另一个目录。我正在使用 SFTP 协议(protocol) put 和 get 方法来完成此任务。我这样做是因为我没有对服务器的 shell 访问权限。下面是我的代码示例和我收到的异常。有人可以告诉我如何解决这个问题吗?

OutputStream outputStream = null;
     InputStream inputStream = null;
    try
    {
        JSch jsch = new JSch();
            session = jsch.getSession(USER,HOST,PORT);
    session.setPassword(PASS);
    java.util.Properties config = new java.util.Properties();
    config.put("StrictHostKeyChecking", "no");
    config.put("PreferredAuthentications", "password"); 
    session.setConfig(config);
    session.connect();
    channel = session.openChannel("sftp");
    channel.connect();
    channelSftp = (ChannelSftp)channel;
        inputStream = channelSftp.get(fromFilename);
    channelSftp.put(inputStream,toFilename);
     } catch(Exception e){
        e.printStackTrace();
    } finally {
        if(inputStream != null)
            inputStream.close();
        if(outputStream != null)
            outputStream.close();
        channelSftp.exit();
    channel.disconnect();
    session.disconnect();
    } 

这是一个异常(exception)

4: java.io.IOException: error: 4: RequestQueue: unknown request id 12
    at com.jcraft.jsch.ChannelSftp._put(ChannelSftp.java:689)
    at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:540)
    at com.jcraft.jsch.ChannelSftp.put(ChannelSftp.java:492)

最佳答案

您必须在一个 channel 中执行 get() 操作,并在另一个 channel 中执行 put() 操作。这样可行。这是我的代码。

 public void cp (Session session, String source, String target) throws Exception {
    log.info("COMMAND: cp " + source + " " + target);

    if (!session.isConnected()) {
        log.error("Session is not connected");
        throw new Exception("Session is not connected...");
    }
    Channel upChannel = null;
    Channel downChannel = null;
    ChannelSftp uploadChannel = null;
    ChannelSftp downloadChannel = null;
    try {
        upChannel = session.openChannel("sftp");
        downChannel = session.openChannel("sftp");
        upChannel.connect();
        downChannel.connect();
        uploadChannel = (ChannelSftp) upChannel;
        downloadChannel = (ChannelSftp) downChannel;
        FileProgressMonitor monitor = new FileProgressMonitor();
        InputStream inputStream = uploadChannel.get(source);

        downloadChannel.put(inputStream, target, monitor);
    } catch (JSchException e) {
        log.error("Auth failure", e);
        throw new Exception(e);
    } finally {
        if (upChannel == null || downChannel == null) {
            System.out.println("Channel is null ...");
        }else if (uploadChannel != null && !uploadChannel.isClosed()){
            uploadChannel.exit();
            downloadChannel.exit();
            uploadChannel.disconnect();
            downloadChannel.disconnect();
        }else if (!upChannel.isClosed()) {
            upChannel.disconnect();
            downChannel.disconnect();
        }
        session.disconnect();
    }
}

关于java - 使用 Jsch 将远程服务器上的文件从一个目录复制到另一个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19869446/

相关文章:

linux - 如何在linux cd命令中传递变量名

java - 使用 JSCH 在 Java 中维护 SSH channel

java - 使用 JSch 在 webapp 中实现 SSH shell 终端

java - Apache Ignite 与 Spring Boot CrudRepo 无法初始化

java - 如何从 Java 引发 Jython 异常?

java - 如何使用字符串创建 Intent 来启动另一个 Activity ?

java - SFTP Java - 管道关闭 Jsch 异常

node.js - 使用 Node.js 中的 ssh2-sftp-client 库通过 HTTP 代理的 SFTP

java - 在 java (Jsch) 上通过 SSH 连接到 Windows 时出现奇怪的符号

java - 我有一个通用方法,它不会采用我将其参数化为的类型