有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法在linux上使用rsync同步单个文件

我有一个在Linux服务器上运行的应用程序。 运行时,此应用程序会创建某些文件,并在创建后使用rsync程序将其复制到其他服务器(也是Linux)。 起初,我使用下一段代码同步整个库:

    private void sync(){
        try {
            String[] cmd = new String[]{"rsync", "--ignore-existing", "-Wre", "/usr/bin/sudo /usr/bin/ssh -i /home/user/.ssh/id_rsa", "/home/user/IntSrv/Sync/Observation",
            "user@some.server:/home/user/GenSrv/Sync/"};
            Process p = new ProcessBuilder().command(cmd).start();
        } catch (IOException ex) {ex.printStackTrace();}}

工作正常,所有文件都已同步

目前我正在尝试更改代码,以便一次同步单个文件。 我已将代码更改为:

private void sync(){
        String orgPath = "/home/user/IntSrv/Sync/" + F.getAbsolutePath().substring(F.getAbsolutePath().indexOf("Observation")).replace("\\", "/");
        String destPath = "user@some.server:/home/user/GenSrv/Sync/" + F.getAbsolutePath().substring(F.getAbsolutePath().indexOf("Observation"), F.getAbsolutePath().indexOf(F.getName())).replace("\\", "/");
        try {
            String[] cmd = new String[]{"rsync", "-avz", "/usr/bin/sudo /usr/bin/ssh -i /home/user/.ssh/id_rsa", orgPath, destPath};
            Process p = new ProcessBuilder().command(cmd).start();
        } catch (IOException ex) {ex.printStackTrace();}
    }

不幸的是,这些文件不同步。 以下是orgPathdestPath的示例:

orgPath = "/home/user/IntSrv/Sync/Observation/2017/204/17d/06/SROD204G30.17o"

destPath = "user@some.server:/home/user/GenSrv/Sync/Observation/2017/204/17d/06/"

我已经在屏幕上打印出了rsync输出。使用工作代码时,它会打印出:

sending incremental file list Observation/2017/204/17d/08/BRIG204I18.17o 966.11K 100% 111.26MB/s 0:00:00 (xfer#1, to-check=0/6) sent 966.40K bytes received 36 bytes 1.93M bytes/sec

运行第二个时,它会打印出:

Permission denied (publickey). rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: unexplained error (code 255) at io.c(600) [sender=3.0.6]

这怎么可能?为什么我有权同步整个目录而不是单个文件? 我做错了什么?谁能解决这个问题? 谢谢你的帮助


共 (2) 个答案

  1. # 1 楼答案

    您可能会从rsync命令的输出中得到一些线索。您可以使用:process.getInputStream()来获取此信息。(有关消费方式,请参见How to redirect Process Builder's output to a string?)。此外,我还要检查明显的问题,文件是否存在,以及命令行上是否使用完全相同的命令?(我本想将上述内容作为一个评论而不是回答,但我在这里是一个新手,因此没有必要的“声誉”,无论如何,希望它能有所帮助。)

  2. # 2 楼答案

    您缺少-e标志,该标志将指示rsyncssh与ssh私钥一起使用

    "-avz"更改为"-avze",您就完成了