我正在尝试编写一个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并且chmoded到755.尝试用“/ system / xbin / rsync”替换“rsync”,但问题仍然存在。这会是什么问题?
答案 0 :(得分:1)
我自己找到了这个问题。
直接从shell运行时,引号具有特定含义,此处需要它们如下:
rsync -rvz -e "ssh -y -p 22" "/path/to/src/" "/path/to/dest"
我上面的java代码片段试图运行带引号转义的命令,例如“\”arg \“”。但在shell外部使用时不需要引号。正确的用法是:
String[] commands = {
"/system/xbin/rsync", "-rvz", "-e", "/system/xbin/ssh -y -p 22",
"/mnt/sdcard", "rajeesh@10.0.2.2:backup/"
};
答案 1 :(得分:0)
我不确定但问题是目的地路径(rajeesh@10.0.2.2:backup /)不是绝对的吗?
另外,如果您要在同一设备中同步文件,也许您应该尝试不使用ssh?做那样的事情:
rsync -rvz /mnt/sdcard/some_directory /backup