如何解决使用java Runtime.getRuntimeexec与命令中的双qoute进行Rsync
您好,我正在尝试执行以下操作:
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
,否则它可能会停顿。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。