我在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();}
}
不幸的是,文件没有同步。
以下是orgPath
和destPath
:
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]
怎么可能?为什么我有权同步整个目录而不是单个文件? 我究竟做错了什么?有谁能解决这个问题? 谢谢你的帮助。
答案 0 :(得分:0)
您可能会从rsync命令的输出中获得一些线索。您可以使用来获取此信息。 (有关消费方式,请参阅process.getInputStream())。此外,我检查显而易见的,文件是否存在,并在命令行上执行完全相同的命令? (我会把上面的内容写成评论而不是答案,但我在这里是一个菜鸟,所以没有必要的"声誉",无论如何希望它有所帮助。)
答案 1 :(得分:0)
您缺少-e
标记,该标记将指示rsync
将ssh
与ssh私钥一起使用。
将"-avz"
更改为"-avze"
,您就完成了。