如何使用JSch的SCP支持在服务器上复制文件?

时间:2012-09-04 05:29:36

标签: java ssh scp jsch

我设法创建了一个将文件上传到目录的方法。

我如何更改此内容以便通过JSch将文件从/123.html复制到/en/123.html?

public void upFile(String source, String fileName, String destination) throws Exception {
    try {

        try {
            // 改变当前路径
            client.cd(destination);
        } catch (Exception e) {
            System.out.println("当前目录不存在,新建目录!");
            JschCreateDir.createDir(host, port, username, password, destination);
            client.cd(destination);
        }

        // 上传本地文件 到当前目录
        File file = new File(source + fileName);
        client.put(new FileInputStream(file), fileName);

    } catch (Exception e) {
        logout();
        throw e;
    }
}

1 个答案:

答案 0 :(得分:2)

我理解你的问题是你要将服务器上的文件从一个目录复制到另一个目录(而不是本地文件到服务器,你的代码似乎已经这样做了。)

不幸的是,SFTP协议(由JSch的ChannelSFTP类实现)不支持直接在服务器上进行复制。 您当然可以将putget结合起来将文件从一个位置复制到另一个位置,但这会将内容从服务器发送到客户端两次,然后返回。

更好的方法是使用exec频道,直接发出服务器系统的复制命令。在unixoid服务器上,这将是cp /123.html /en/123.html。 (这假设你有对服务器的shell访问权限,而不是sftp-only访问权限,因为我已经在某处看到了。)

以下是一些代码(未经过测试,您可能需要添加异常处理):

public void copyFile(Session session, String sourceFile, String destinationFile) {
    ChannelExec channel = (ChannelExec) session.openChannel("exec");
    channel.setCommand("cp " + sourceFile + " " + destinationFile);
    channel.connect();
    while(channel.isConnected()) {
        Thread.sleep(20);
    }
    int status = channel.getExitStatus();
    if(status != 0)
      throw new CopyException("copy failed, exit status is " + status);
}