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

时间:2013-11-08 22:10:56

标签: java sftp jsch

我正在尝试使用Jsch将服务器上的文件从一个目录复制到另一个目录。我正在使用SFTP协议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();
    } 

这是例外

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)

1 个答案:

答案 0 :(得分:1)

您必须在一个通道中执行get()操作,并将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();
    }
}
相关问题