【问题标题】:How to execute a bash script from java program如何从java程序执行bash脚本
【发布时间】:2016-03-15 19:09:05
【问题描述】:

我希望我的 Java 程序执行一个 bash 脚本并将输出返回给 Java。诀窍是我的脚本启动了某种“交互式会话”,我想这就是我的 Java 应用程序冻结的原因(我想进入一个无限循环)。这是我用来执行脚本的代码,我使用 ProcessBuilder 来执行此操作。我也试过了

Runtime.getRuntime().exec(PathToScript);

它也不起作用。

public class test1 {
public static void main(String a[]) throws InterruptedException, IOException {

    List<String> commands = new ArrayList<String>();
    List<String> commands1 = new ArrayList<String>();

    commands.add("/Path/To/Script/skrypt3.sh");
    commands.add("> /dev/ttys002");



    ProcessBuilder pb = new ProcessBuilder(commands);
    pb.redirectErrorStream(true);
    try {

        Process prs = pb.start();
        Thread inThread = new Thread(new In(prs.getInputStream()));
        inThread.start();
        Thread.sleep(1000);
        OutputStream writeTo = prs.getOutputStream();
       writeTo.write("oops\n".getBytes());
        writeTo.flush();
        writeTo.close();

    } catch (IOException e) {
        e.printStackTrace();

    }
}
}

class In implements Runnable {

private InputStream is;

public In(InputStream is) {
    this.is = is;
}

@Override
public void run() {
    try {
        byte[] b = new byte[1024];
        int size = 0;
        while ((size = is.read(b)) != -1) {



            System.out.println(new String(b));
        }
        is.close();
    } catch (IOException ex) {
        Logger.getLogger(In.class.getName()).log(Level.SEVERE, null, ex);
    }

}
}

这是我尝试执行的脚本。当我直接从终端运行它时,它就像一个魅力。

#!/bin/bash          
drozer console connect << EOF > /dev/ttys002
permissions
run app.package.info -a com.mwr.example.sieve
exit
EOF

【问题讨论】:

  • 您是否尝试在脚本文件前添加bash/bin/bash(在ProcessBuilder 或Runtime 中)?
  • 我刚试过,没有结果。问题是它抛出“找不到命令”异常。我知道这些是我的自定义命令,但为什么 java 需要处理脚本中的每个命令。让我们在终端中运行它。有什么办法吗?

标签: java bash shell terminal processbuilder


【解决方案1】:

您不应尝试将重定向指令添加为命令名称的一部分:

commands.add("/Path/To/Script/skrypt3.sh");
commands.add("> /dev/ttys002");
ProcessBuilder pb = new ProcessBuilder(commands);

改为使用redirectOutput 方法,如下所示:

tty = new File("/dev/ttys002");
ProcessBuilder pb = new ProcessBuilder("/Path/To/Script/skrypt3.sh")
    .redirectOutput(ProcessBuilder.Redirect.appendTo(tty))
    .redirectError(ProcessBuilder.Redirect.appendTo(tty))
    .start();

不过,您的 bash 脚本似乎已经在处理重定向,所以不确定您是否需要在 Java 中执行此操作。

请参阅this answer 了解更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 2022-10-18
    • 2020-03-27
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多