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

时间:2017-07-23 06:34:47

标签: java linux ssh 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 个答案:

答案 0 :(得分:0)

您可能会从rsync命令的输出中获得一些线索。您可以使用enter image description here来获取此信息。 (有关消费方式,请参阅process.getInputStream())。此外,我检查显而易见的,文件是否存在,并在命令行上执行完全相同的命令? (我会把上面的内容写成评论而不是答案,但我在这里是一个菜鸟,所以没有必要的"声誉",无论如何希望它有所帮助。)

答案 1 :(得分:0)

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

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