Rsync 在命令中使用 java Runtime.getRuntime().exec() 和双引号

Rsync using java Runtime.getRuntime().exec() with double qoute in command

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

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());

但我收到以下命令错误 line.Command 在命令行上正确执行

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

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

请帮忙指正

您的方法行不通,因为 Runtime.exec() 没有意识到“ssh -i /root/.ssh/key”是 rsync 的单个参数。转义 double-quotes 可以让编译器满意,但不会消除根本问题,这是 built-in 分词器的限制。

你可能会遇到这样的事情:

Process p = Runtime.getRuntime().exec
    (new String[]{"rsync", "-e", "ssh -i /root/.ssh/key", "-va" "--relative" ... });

也就是自己对命令行进行分词,将各个分词组成一个String[]。您是在提前决定 rsync 的参数是什么,而不是让 exec() 弄清楚(错误地)。

不要忘记,如果 rsync 产生任何输出,您需要安排您的应用程序使用它的 stdoutstderr,否则它可能会停止。