首页 > 解决方案 > 在命令中使用带有双 qoute 的 java Runtime.getRuntime().exec() 进行 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 密钥的命令中的双引号。

请帮忙改正。

标签: javacmdruntimersyncprocessbuilder

解决方案


您的方法不起作用,因为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产生任何输出,您需要安排您的应用程序使用它的stdoutand stderr,否则它可能会停止。


推荐阅读