【问题标题】:Rsync using java Runtime.getRuntime().exec() with double qoute in command在命令中使用带有双引号的 java Runtime.getRuntime().exec() 进行 Rsync
【发布时间】:2020-09-09 11:54:24
【问题描述】:

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

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 密钥的命令中的双引号。

请帮忙改正。

【问题讨论】:

    标签: java cmd runtime rsync processbuilder


    【解决方案1】:

    您的方法不起作用,因为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,否则它可能会停止。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2021-09-14
      相关资源
      最近更新 更多