问题描述
您好,我正在尝试执行以下操作:
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());
但是我在命令行中遇到以下错误。命令在命令行上正确执行
在remote-shell命令中缺少尾随-”。 rsync错误:main.c(361)[sender = 3.0.6]
处的语法或用法错误(代码1)问题是由于我在提到ssh key的命令中使用了双引号。
请帮助纠正。
解决方法
您的方法行不通,因为Runtime.exec()
没有意识到“ ssh -i /root/.ssh/key”是rsync
的单个参数。转义双引号可以使编译器满意,但不能消除根本的问题,即内置标记器的局限性。
您可能会遇到更多类似这样的运气:
Process p = Runtime.getRuntime().exec
(new String[]{"rsync","-e","ssh -i /root/.ssh/key","-va" "--relative" ... });
也就是说,您可以自己对命令行进行标记,然后将各个标记组成String[]
。您是在预先确定rsync
的参数是什么,而不是让exec()
(错误地)弄清楚。
请不要忘记,如果rsync
产生任何输出,则需要安排您的应用程序使用其stdout
和stderr
,否则它可能会停顿。