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

Unable to sync a single file using rsync on linux

我在 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]

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

您可能会从 rsync 命令的输出中得到一些线索。您可以使用:process.getInputStream(). (See How to redirect Process Builder's output to a string? 了解消费方式)。另外我会检查明显的,文件是否存在,以及完全相同的命令是否在命令行上工作? (我会把上面的内容写成评论而不是答案,但我是这里的菜鸟所以没有所需的 "reputation",无论如何希望它有所帮助。)

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

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