pinky
pinky

Reputation: 1

Copy a file on remote server from one directory to other using Jsch

I am trying to copy a file on server from one directory to another one using Jsch. I am using SFTP protocol put and get methods to accomplish this task. I am doing this way as I dont have shell access to the server. Below is my code sample and the exception that I am getting. Can someone please let me know how to resolve it.

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();
    } 

Here is the 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)

Upvotes: 0

Views: 9559

Answers (1)

Chathuri
Chathuri

Reputation: 33

You have to do the get() operation in a one channel and put() operation in another channel. That works. Here is my code.

 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();
    }
}

Upvotes: 2

Related Questions