gpt4 book ai didi

Java 在远程服务器上执行带有参数的 JAR

转载 作者:行者123 更新时间:2023-11-30 10:31:10 24 4
gpt4 key购买 nike

我有一个程序需要在多个服务器上执行命令。我使用 Runtime.getRuntime().exec(); 进行了一些本地测试,结果运行良好。

但是一旦我想执行远程命令,它就不起作用了。例如,如果我这样做

ssh user@10.20.30.40 'touch /tmp/hello.txt'

它适用于我的终端。但它在我的 Java 程序中不起作用:

Runtime.getRuntime().exec("ssh user@10.20.30.40 'touch /tmp/hello.txt'");

您是否有一个解决方案可以在简单的 main.java 中执行远程命令以进行测试(不需要日志和生产安全性等等)?

谢谢!

编辑:目标是使用这样的参数执行 JAR(日志并不重要,但会更好):

ssh user@10.20.30.40 'java -jar -Dbroker-ip=10.20.30.41 -Dtopic=topic -Dpartition-number=32 -Dthread=8 -Dsource=/tmp/hour_moves /opt/Produce.jar  > /tmp/logThread1 &'

最佳答案

您的命令字符串必须先拆分为命令数组才能执行。在终端,这将由 shell 完成。单引号字符对 shell 有特殊意义。命令数组将如下所示:

cmdarray[0] = "ssh";
cmdarray[1] = "user@10.20.30.40";
cmdarray[2] = "touch /tmp/hello.txt";

您的 exec() 版本使用另一个字符串分词器,在空白字符处拆分字符串。现在命令数组如下所示:

cmdarray[0] = "ssh";
cmdarray[1] = "user@10.20.30.40";
cmdarray[2] = "'touch";
cmdarray[3] = "/tmp/hello.txt'";

因此无法在远程服务器上找到可执行文件'touch

顺便说一句:没有必要使用单引号。这也应该有效(在两种情况下):

ssh user@10.20.30.40 touch /tmp/hello.txt

其他特殊的 shell 字符,如 >& 必须在终端进行转义以传递到远程站点(不由 shell 解释,但作为参数传递ssh 命令)。如果您使用 exec(),则不必对这些字符进行转义。

注意 exec() 的返回类型:它是一个 Process 对象。最好用

Runtime.getRuntime().exec(...).waitFor();

确保命令已经完成。

关于Java 在远程服务器上执行带有参数的 JAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43324781/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com