使用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产生任何输出,则需要安排您的应用程序使用其stdoutstderr,否则它可能会停顿。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...