2

我正在尝试编写一个 android 应用程序,该应用程序使用 rsync 和 ssh 将数据从 android 设备的选定目录备份到远程主机。当我从 adb shell 运行 rsync 命令时,它可以工作:

rsync -rvz -e "/system/xbin/ssh -y -p 22" "/mnt/sdcard/" "rajeesh@10.0.2.2:backup/"

但是我使用 Runtime.exec 的 java 代码失败并显示错误:

Error: rsync: failed to exec /system/xbin/ssh -y -p 22: No such file or directory (2)

我使用的代码如下:

String[] commands = {
  "rsync", "-rvz", "-e", "\"/system/xbin/ssh -y -p 22\"",
  "\"/mnt/sdcard/\"", "\"rajeesh@10.0.2.2:backup/\""
};
Process process = Runtime.getRuntime().exec(commands);

rsync 和 ssh 都已放置在 /system/xbin 并 chmod 为 755。尝试将“rsync”替换为“/system/xbin/rsync”,但问题仍然存在。这里会有什么问题?

4

2 回答 2

1

自己发现了问题。

直接从 shell 运行时,引号具有特定含义,此处需要它们,如下所示:

rsync -rvz -e "ssh -y -p 22" "/path/to/src/" "/path/to/dest"

我上面的 java 代码片段试图运行带有转义引号的命令,例如“\”arg\“”。但在外壳外使用时不需要引号。正确的用法是:

String[] commands = {
    "/system/xbin/rsync", "-rvz", "-e", "/system/xbin/ssh -y -p 22",
    "/mnt/sdcard", "rajeesh@10.0.2.2:backup/"
};
于 2013-08-18T06:25:22.200 回答
0

我不确定,但问题可能是目标路径 (rajeesh@10.0.2.2:backup/) 不是绝对的?

另外,如果您要在同一设备上同步文件,也许您应该尝试不使用 ssh?并做这样的事情:

rsync -rvz /mnt/sdcard/some_directory /backup
于 2013-08-16T10:23:21.353 回答