无法在 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();}
}
不幸的是,文件没有同步。
这是 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]
这怎么可能?为什么我有权同步整个目录而不是单个文件?
我究竟做错了什么?谁能解决这个问题?
感谢您的帮助。
您可能会从 rsync 命令的输出中得到一些线索。您可以使用:process.getInputStream(). (See How to redirect Process Builder's output to a string? 了解消费方式)。另外我会检查明显的,文件是否存在,以及完全相同的命令是否在命令行上工作? (我会把上面的内容写成评论而不是答案,但我是这里的菜鸟所以没有所需的 "reputation",无论如何希望它有所帮助。)
您缺少 -e
标志,它将指示 rsync
将 ssh
与 ssh 私钥一起使用。
将 "-avz"
更改为 "-avze"
,您就完成了。
我在 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]
这怎么可能?为什么我有权同步整个目录而不是单个文件? 我究竟做错了什么?谁能解决这个问题? 感谢您的帮助。
您可能会从 rsync 命令的输出中得到一些线索。您可以使用:process.getInputStream(). (See How to redirect Process Builder's output to a string? 了解消费方式)。另外我会检查明显的,文件是否存在,以及完全相同的命令是否在命令行上工作? (我会把上面的内容写成评论而不是答案,但我是这里的菜鸟所以没有所需的 "reputation",无论如何希望它有所帮助。)
您缺少 -e
标志,它将指示 rsync
将 ssh
与 ssh 私钥一起使用。
将 "-avz"
更改为 "-avze"
,您就完成了。