Rsync使用java Runtime.getRuntime().exec()和双qoute命令

Rsync使用java Runtime.getRuntime().exec()和双qoute命令,java,cmd,runtime,rsync,processbuilder,Java,Cmd,Runtime,Rsync,Processbuilder,您好,我正在尝试执行以下操作: Process p = null; StringBuffer rbCmd = new StringBuffer(); rbCmd.append("rsync -e \"ssh -i /root/.ssh/key\" -va --relative /home/lego/hyb/abc/PVR2/Testdata/./R887/SCM/System root@myMachine:/xyz/data/SCMdata/"); p

您好,我正在尝试执行以下操作:

Process p = null;
StringBuffer rbCmd = new StringBuffer();

rbCmd.append("rsync -e \"ssh -i /root/.ssh/key\" -va --relative /home/lego/hyb/abc/PVR2/Testdata/./R887/SCM/System root@myMachine:/xyz/data/SCMdata/");

p = Runtime.getRuntime().exec(rbCmd.toString());
但我在命令行上遇到以下错误。命令在命令行上正确执行

远程shell命令中缺少尾随“-”。 rsync错误:main.c(361)[sender=3.0.6]的语法或用法错误(代码1)

问题是因为我提到ssh密钥的命令中有双引号


请帮助更正。

您的方法不起作用,因为
Runtime.exec()
没有意识到“ssh-i/root/.ssh/key”是
rsync
的单个参数。转义双引号可以让编译器满意,但不会消除基本问题,即内置标记器的限制

您可能会更幸运地使用以下内容:

Process p = Runtime.getRuntime().exec
    (new String[]{"rsync", "-e", "ssh -i /root/.ssh/key", "-va" "--relative" ... });
也就是说,您自己对命令行进行标记,并将各个标记形成一个
字符串[]
。您要提前决定
rsync
的参数是什么,而不是允许
exec()
来找出它(错误地)

不要忘记,如果
rsync
产生任何输出,您需要安排应用程序使用其
stdout
stderr
,否则它可能会暂停