【问题标题】:Execute shell script multiple commands in one line using Process Builder in Java (Unix)使用Java(Unix)中的Process Builder在一行中执行shell脚本多个命令
【发布时间】:2019-11-22 23:15:19
【问题描述】:

我有一个我想从 java 执行的 shell 脚本。

sudo su - username -c "ssh -t remote_hostname df -k"

当您从命令提示符运行时,此 shell 脚本可以正常工作。 但是,当我使用流程构建器时,它不会返回任何内容。如果我执行以下操作: sudo su - 用户名 -c ssh -t remote_hostname;df -k

然后命令在我的本地机器上运行,而不是在远程机器上。

感谢任何反馈。


java代码

Process p;

ExecutorService es = null;
try {

p = Runtime.getRuntime().exec(test1.sh);

StreamGobbler sg = new StreamGobbler(p.getInputStream(), System.out::println());

es = Executors.newSingleThreadExecutor();

es.submt(sg);

int exitCode = p.waitfor();

assert exitCode == 0;

es.shutdown();


} catch (....) {
}

【问题讨论】:

  • 你能显示你的代码吗?可能值得注意的是,如果您从 Eclipse 运行,通常不会设置您的 shell 环境
  • 什么机器?您的 ssh 命令不包含一个,您确定该命令从提示符运行吗?
  • 用java代码更新了内容
  • shel 脚本 tst1.sh 包含 sudo su - username -c "ssh -t remote_hostname df -k"

标签: java processbuilder


【解决方案1】:

Runtime.exec(String) 不是外壳,特别是不像外壳那样解析和处理引号。骗子:
Why does Runtime.exec(String) work for some but not all commands?
Whitespace in bash path with java
Keytool command does not work when invoked with Java

做类似的事情

String[] cmd = { "sudo", "su", "-", "username", "-c", "ssh -t remote_hostname df -k" };
// note the last element is a single Java String that does not _contain_ 
// any quote characters (which would be backslashed in Java source)
... Runtime.getRuntime().exec(cmd) ...

此外,在远程处理df -k 时,您不应该需要-t——它不做任何特殊的输出处理。 (虽然它不疼,而且几乎是免费的。)

【讨论】:

  • 非常感谢,上述解决方案有效。我非常感谢您的回答,因为我花了一周的时间试图弄清楚为什么它在 Java 中不起作用。
  • 是的,戴夫,你是对的......我删除了我的回复,因为内容完全错误......无论如何,这个话题引起了我的一些兴趣,所以我开始编写一些代码......我认为这个java方面可以改进写一些不错的库!今晚我开始编写一个库来使用 exec() 方法从 java 代码中执行整个脚本。如果你有兴趣贡献这里的 github 链接 github.com/robertomanfreda/java_bash_executor 。我使用的解决方法是:逐行读取文件,以base64编码内容并使用base64在/bin/bash上执行编码内容:)
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 2014-08-28
  • 2017-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
相关资源
最近更新 更多