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
产生任何输出,您需要安排您的应用程序使用它的 stdout
和 stderr
,否则它可能会停止。
您好,我正在尝试执行以下操作:
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
产生任何输出,您需要安排您的应用程序使用它的 stdout
和 stderr
,否则它可能会停止。